martong added a comment.

In D79433#2022244 <https://reviews.llvm.org/D79433#2022244>, @xazax.hun wrote:

> This is cool!


Hi Gabor, thanks for the reviews! :)

> Some questions:
> 
> 1. Have you reported those bugs to CppCheck devs? It might be useful for us 
> as well, as they can also double-check who is right.

Yes, I just have done that: 
https://github.com/danmar/cppcheck/pull/2628
https://github.com/danmar/cppcheck/pull/2629
https://github.com/danmar/cppcheck/pull/2630
Actually by reporting these bugs I realized that not all have been fixed 
completely here in this patch, see the latest update.

> 2. This is a really large number of summaries. At this point, I wonder if it 
> would be worth have a separate checker for them (that is utilizing the same 
> infrastructure).

I was thinking about to rename this checker: `StdLibraryFunctionsChecker` -> 
`LibraryFunctionsChecker`. And we could add a checker option (or a subchecker) 
to enable these summaries for POSIX.

> 3. Is it worth to have the script you used to do the conversion available for 
> other people?

Well, that is just some hacky-wacky scratch of mine that I did not plan to 
share. But I am pasting it here in its current state, maybe that has some value 
for somebody in the future.

  #!/usr/bin/python3
  import subprocess
  import sys
  import xml.etree.ElementTree as ET
  from io import StringIO
  
  
  blacklist = [
      'strchr',
      'ctime',
  ]
  
  whitelist = [
  'select',
  'close',
  'htons',
  'socket',
  'setsockopt',
  ]
  
  
  def decr(nr):
      return str(int(nr) - 1)
  
  
  root = ET.parse(sys.argv[1]).getroot()
  for function in root.findall('function'):
  
      pureness = "NoEvalCall"
      if function.find('pure') is not None:
          pureness = "EvalCallAsPure"
  
      names = function.get('name')
      for name in names.split(","):
  
          if name.endswith("_l"):
              continue
  
          # if name in blacklist:
              # continue
  
          # if name not in whitelist:
              # continue
  
          if name.startswith("std::"):
              continue
  
          old_stdout = sys.stdout
          sys.stdout = mystdout = StringIO()
  
          # Get the signature that is in a comment. Unfortunately comments are
          # skipped from the XML during read.
          sign = subprocess.run(
              ['/bin/grep', str(name) + '(', sys.argv[1]],
              stdout=subprocess.PIPE)
          sign = sign.stdout.decode('utf-8')
          sign = sign.replace(
              '<!--',
              '').replace(
              '-->',
              '').replace(
              '\n',
              '').strip()
          print("// " + sign)
  
          print("addToFunctionSummaryMap(\"" + str(name) +
                # "\",\nSummary(ArgTypes{}, RetType{}, " + pureness + ")")
                "\",\nSummary(" + pureness + ")")
  
          returnValue = function.find('returnValue')
          returnValueConstraint = None
          if returnValue is not None:
              if returnValue.text is not None:  # returnValue constraint
                  returnValueConstraint = returnValue.text
          if returnValueConstraint is not None:
              print(".Case({})".format(returnValue.text))
  
          args = function.findall('arg')
          for arg in args:
              if arg is not None:
                  nr = arg.get('nr')
                  if nr is None or nr == 'any':
                      continue
                  nr = decr(nr)
  
                  notnull = arg.find('not-null')
                  if notnull is not None:
                      print(".ArgConstraint(NotNull(ArgNo(" + nr + ")))")
  
                  valid = arg.find('valid')
                  if valid is not None:
                      if valid.text.endswith(':'):
                          l = valid.text.split(':')
                          print(
                              ".ArgConstraint(ArgumentCondition({}, 
WithinRange, Range({}, Max)))".format(
                                  nr, l[0]))
                      else:
                          print(
                              ".ArgConstraint(ArgumentCondition({}, 
WithinRange, Range({})))".format(
                                  nr, valid.text))
  
                  minsize = arg.find('minsize')
                  if minsize is not None:
                      mstype = minsize.get('type')
                      if mstype == 'argvalue':
                          print(
                              ".ArgConstraint(BufferSize({},{}))".format(
                                  nr, decr(minsize.get('arg'))))
                      if mstype == 'mul':
                          print(
                              ".ArgConstraint(BufferSize({},{},{}))".format(
                                  nr, decr(
                                      minsize.get('arg')), decr(
                                      minsize.get('arg2'))))
  
          print(");")
  
          # Print only non-trivial summaries.
          sys.stdout = old_stdout
          if ".ArgConstraint" in mystdout.getvalue() or ".Case" in 
mystdout.getvalue():
              print(mystdout.getvalue())



> Are there other summaries we might be interested in, like Qt or other popular 
> libraries?

Absolutely. In telecomm we are interested in openssl and libcurl, but the 
number of functions in the corresponding xmls is quite low compared to Posix.
Also, Posix has a pretty stable standardized interface that is not really a 
subject of change. However, other libs may change more frequently, so I don't 
think we could support them similarly to Posix. 
Furthermore, Posix and Libc are essential libs used almost by all C/C++ 
programs in some form. The other libs are not that common, so I'd rather not 
add extra compilation time of this checker for supporting them.
So, I think, once we are capable of handling our own format for summaries (with 
our own Yaml format or by extending API-notes) then should we port those libs.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D79433/new/

https://reviews.llvm.org/D79433



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to