GithubHelp home page GithubHelp logo

staticfg's People

Contributors

andreinaku avatar coetaur0 avatar leonardt avatar robertgolosynsky avatar vishwesh-d-kumar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

staticfg's Issues

Attribute error

Installed the package successfully on two Linux box Raspbian 8 Jessie (Python 3.4) and Ubuntu 18.04 (Python 3.6) following the instructions in the Readme.
But both throw the same error:

Ubuntu 18.04 / Python 3.6

Python 3.6.5 (default, Apr  1 2018, 05:46:30) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from staticfg import CFGBuilder
>>> cfg = CFGBuilder().build_from_file('the_script.py', './the_script.py')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/dist-packages/staticfg/builder.py", line 124, in build_from_file
    return self.build_from_src(name, src)
  File "/usr/local/lib/python3.6/dist-packages/staticfg/builder.py", line 108, in build_from_src
    return self.build(name, tree)
  File "/usr/local/lib/python3.6/dist-packages/staticfg/builder.py", line 92, in build
    self.visit(tree)
  File "/usr/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/usr/lib/python3.6/ast.py", line 261, in generic_visit
    self.visit(item)
  File "/usr/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/usr/lib/python3.6/ast.py", line 261, in generic_visit
    self.visit(item)
  File "/usr/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/usr/local/lib/python3.6/dist-packages/staticfg/builder.py", line 374, in visit_FunctionDef
    self.new_functionCFG(node, async=False)
  File "/usr/local/lib/python3.6/dist-packages/staticfg/builder.py", line 201, in new_functionCFG
    self.current_id)
  File "/usr/local/lib/python3.6/dist-packages/staticfg/builder.py", line 92, in build
    self.visit(tree)
  File "/usr/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/usr/lib/python3.6/ast.py", line 261, in generic_visit
    self.visit(item)
  File "/usr/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/usr/local/lib/python3.6/dist-packages/staticfg/builder.py", line 241, in visit_Expr
    self.generic_visit(node)
  File "/usr/lib/python3.6/ast.py", line 263, in generic_visit
    self.visit(value)
  File "/usr/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/usr/local/lib/python3.6/dist-packages/staticfg/builder.py", line 246, in visit_Call
    func_name = "{}.{}".format(func.value.id, func.attr)
AttributeError: 'Attribute' object has no attribute 'id'

Raspbian 8 / Python 3.4

Python 3.4.2 (default, Oct 19 2014, 13:31:11) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from staticfg import CFGBuilder
>>> cfg = CFGBuilder().build_from_file('the_script.py', './the_script.py')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/dist-packages/staticfg/builder.py", line 124, in build_from_file
    return self.build_from_src(name, src)
  File "/usr/local/lib/python3.4/dist-packages/staticfg/builder.py", line 108, in build_from_src
    return self.build(name, tree)
  File "/usr/local/lib/python3.4/dist-packages/staticfg/builder.py", line 92, in build
    self.visit(tree)
  File "/usr/lib/python3.4/ast.py", line 245, in visit
    return visitor(node)
  File "/usr/lib/python3.4/ast.py", line 253, in generic_visit
    self.visit(item)
  File "/usr/lib/python3.4/ast.py", line 245, in visit
    return visitor(node)
  File "/usr/lib/python3.4/ast.py", line 253, in generic_visit
    self.visit(item)
  File "/usr/lib/python3.4/ast.py", line 245, in visit
    return visitor(node)
  File "/usr/local/lib/python3.4/dist-packages/staticfg/builder.py", line 374, in visit_FunctionDef
    self.new_functionCFG(node, async=False)
  File "/usr/local/lib/python3.4/dist-packages/staticfg/builder.py", line 201, in new_functionCFG
    self.current_id)
  File "/usr/local/lib/python3.4/dist-packages/staticfg/builder.py", line 92, in build
    self.visit(tree)
  File "/usr/lib/python3.4/ast.py", line 245, in visit
    return visitor(node)
  File "/usr/lib/python3.4/ast.py", line 253, in generic_visit
    self.visit(item)
  File "/usr/lib/python3.4/ast.py", line 245, in visit
    return visitor(node)
  File "/usr/local/lib/python3.4/dist-packages/staticfg/builder.py", line 241, in visit_Expr
    self.generic_visit(node)
  File "/usr/lib/python3.4/ast.py", line 255, in generic_visit
    self.visit(value)
  File "/usr/lib/python3.4/ast.py", line 245, in visit
    return visitor(node)
  File "/usr/local/lib/python3.4/dist-packages/staticfg/builder.py", line 246, in visit_Call
    func_name = "{}.{}".format(func.value.id, func.attr)
AttributeError: 'Attribute' object has no attribute 'id'

The target script requires Python 2.7 to run if that's relevant to this issue.

Problem with .function() syntax

I'm not entirely sure what is the problem, but I have a couple of examples:

This one fails

a = [1,2].count(2)
print(a)

But this one works

print([1,2].count(2))

The error I get on the failing one is

Traceback (most recent call last):
  File "/home/jjk/git/staticfg/examples/build_cfg.py", line 15, in <module>
    cfg = CFGBuilder().build_from_file(cfg_name, args.input_file)
  File "/usr/lib/python3.7/site-packages/staticfg/builder.py", line 124, in build_from_file
    return self.build_from_src(name, src)
  File "/usr/lib/python3.7/site-packages/staticfg/builder.py", line 108, in build_from_src
    return self.build(name, tree)
  File "/usr/lib/python3.7/site-packages/staticfg/builder.py", line 92, in build
    self.visit(tree)
  File "/usr/lib/python3.7/ast.py", line 262, in visit
    return visitor(node)
  File "/usr/lib/python3.7/ast.py", line 270, in generic_visit
    self.visit(item)
  File "/usr/lib/python3.7/ast.py", line 262, in visit
    return visitor(node)
  File "/usr/lib/python3.7/site-packages/staticfg/builder.py", line 268, in visit_Assign
    self.generic_visit(node)
  File "/usr/lib/python3.7/ast.py", line 272, in generic_visit
    self.visit(value)
  File "/usr/lib/python3.7/ast.py", line 262, in visit
    return visitor(node)
  File "/usr/lib/python3.7/site-packages/staticfg/builder.py", line 263, in visit_Call
    func_name = visit_func(func)
  File "/usr/lib/python3.7/site-packages/staticfg/builder.py", line 255, in visit_func
    func_name += "." + node.attr
TypeError: unsupported operand type(s) for +=: 'NoneType' and 'str'

Didn't aware of string.join and os.path.join

$ python3 examples/build_cfg.py /home/user/code-coba-home/manual-compile/staticfg/foo.py /home/user/code-coba-home/manual-compile/staticfg/
Traceback (most recent call last):
  File "examples/build_cfg.py", line 15, in <module>
    cfg = CFGBuilder().build_from_file(cfg_name, args.input_file)
  File "/home/user/.virtualenvs/global_py3/lib/python3.5/site-packages/staticfg/builder.py", line 124, in build_from_file
    return self.build_from_src(name, src)
  File "/home/user/.virtualenvs/global_py3/lib/python3.5/site-packages/staticfg/builder.py", line 108, in build_from_src
    return self.build(name, tree)
  File "/home/user/.virtualenvs/global_py3/lib/python3.5/site-packages/staticfg/builder.py", line 92, in build
    self.visit(tree)
  File "/usr/lib/python3.5/ast.py", line 245, in visit
    return visitor(node)
  File "/usr/lib/python3.5/ast.py", line 253, in generic_visit
    self.visit(item)
  File "/usr/lib/python3.5/ast.py", line 245, in visit
    return visitor(node)
  File "/home/user/.virtualenvs/global_py3/lib/python3.5/site-packages/staticfg/builder.py", line 384, in visit_FunctionDef
    self.new_functionCFG(node, asynchr=False)
  File "/home/user/.virtualenvs/global_py3/lib/python3.5/site-packages/staticfg/builder.py", line 201, in new_functionCFG
    self.current_id)
  File "/home/user/.virtualenvs/global_py3/lib/python3.5/site-packages/staticfg/builder.py", line 92, in build
    self.visit(tree)
  File "/usr/lib/python3.5/ast.py", line 245, in visit
    return visitor(node)
  File "/usr/lib/python3.5/ast.py", line 253, in generic_visit
    self.visit(item)
  File "/usr/lib/python3.5/ast.py", line 245, in visit
    return visitor(node)
  File "/home/user/.virtualenvs/global_py3/lib/python3.5/site-packages/staticfg/builder.py", line 310, in visit_If
    self.visit(child)
  File "/usr/lib/python3.5/ast.py", line 245, in visit
    return visitor(node)
  File "/home/user/.virtualenvs/global_py3/lib/python3.5/site-packages/staticfg/builder.py", line 264, in visit_Assign
    self.generic_visit(node)
  File "/usr/lib/python3.5/ast.py", line 255, in generic_visit
    self.visit(value)
  File "/usr/lib/python3.5/ast.py", line 245, in visit
    return visitor(node)
  File "/home/user/.virtualenvs/global_py3/lib/python3.5/site-packages/staticfg/builder.py", line 259, in visit_Call
    func_name = visit_func(func)
  File "/home/user/.virtualenvs/global_py3/lib/python3.5/site-packages/staticfg/builder.py", line 255, in visit_func
    func_name += "." + node.attr
TypeError: unsupported operand type(s) for +=: 'NoneType' and 'str'

AssertionError: Target of a link must be a block`

Hello! Thanks for your excellent code. When I use staticfg, I encountered error below, could you help me to fix it?:

Traceback (most recent call last):
  File "debug-more-data-get_pycfg_dot.py", line 49, in <module>
    cfg = CFGBuilder().build_from_file(cfg_name, input_file)
  File "/data/wanyao/work/code/test-extr-com/fix-case-split/staticfg-dj/staticfg/builder.py", line 124, in build_from_file
    return self.build_from_src(name, src)
  File "/data/wanyao/work/code/test-extr-com/fix-case-split/staticfg-dj/staticfg/builder.py", line 108, in build_from_src
    return self.build(name, tree)
  File "/data/wanyao/work/code/test-extr-com/fix-case-split/staticfg-dj/staticfg/builder.py", line 92, in build
    self.visit(tree)
  File "/usr/share/anaconda3/envs/36t041/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/usr/share/anaconda3/envs/36t041/lib/python3.6/ast.py", line 261, in generic_visit
    self.visit(item)
  File "/usr/share/anaconda3/envs/36t041/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/data/wanyao/work/code/test-extr-com/fix-case-split/staticfg-dj/staticfg/builder.py", line 386, in visit_FunctionDef
    self.new_functionCFG(node, asynchr=False)
  File "/data/wanyao/work/code/test-extr-com/fix-case-split/staticfg-dj/staticfg/builder.py", line 201, in new_functionCFG
    self.current_id)
  File "/data/wanyao/work/code/test-extr-com/fix-case-split/staticfg-dj/staticfg/builder.py", line 92, in build
    self.visit(tree)
  File "/usr/share/anaconda3/envs/36t041/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/usr/share/anaconda3/envs/36t041/lib/python3.6/ast.py", line 261, in generic_visit
    self.visit(item)
  File "/usr/share/anaconda3/envs/36t041/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/data/wanyao/work/code/test-extr-com/fix-case-split/staticfg-dj/staticfg/builder.py", line 284, in visit_Assert
    self.add_exit(self.current_block, failblock, invert(node.test))
  File "/data/wanyao/work/code/test-extr-com/fix-case-split/staticfg-dj/staticfg/builder.py", line 158, in add_exit
    newlink = Link(block, nextblock, exitcase)
  File "/data/wanyao/work/code/test-extr-com/fix-case-split/staticfg-dj/staticfg/model.py", line 119, in __init__
    assert type(target) == Block, "Target of a link must be a block"
AssertionError: Target of a link must be a block

Here are two example files that cause the error
first one:

def load_passphrase_from_file():
	vf_path = os.path.expanduser(kVFPassphraseFile)
	assert (os.access(vf_path, os.F_OK) and os.access(vf_path, os.R_OK)), ('%s	must	exist	and	be	readable' % vf_path)
	with open(vf_path) as f:
		user_data = f.read()
	return user_data.strip('\n')

second:

def test_find_number_6():
	s = 'query1e5	not	found'
	r = find_number(s)
	assert (s[r[0]:r[1]] == '1e5')

Replace ast.NameConstant with ast.Constant

Hello!

ast.NameConstant has been deprecated in Python 3.8 and ast.Constant is used for all constants. This might affect builder.py::invert and builder.py::visit_While.

Using other modules

staticfg is looking great for single-file sources. Are there any plans to draw the call graphs with imported modules? What would be needed to make this happen?

handling attributes in ast.Call

Hi,

I would like to add the following code to handle parsing of attributes and function names. The current code does not handle constructs such as "-".join(somelist)

Thanks!

def visit_Call(self, node):
    def visit_func(node):
        if type(node) == ast.Name:
            return node.id

       # start changes
        elif type(node) == ast.Attribute:
            # Recursion on series of calls to attributes.
            if type(node.value) == ast.Call:
                func_name = visit_func(node.value.func)
            elif type(node.value) == ast.Constant:
                func_name = node.value.value
            else:
                func_name = visit_func(node.value)
       # end changes

            func_name += "." + node.attr
            return func_name
        elif type(node) == ast.Str:
            return node.s
        elif type(node) == ast.Subscript:
            return node.value.id

Error on lists in lists

If I run CFGBuilder().build_from_file() on a file with such code

p= []
p.append([])
p[0].append(x)

I get

Exception has occurred: TypeError
unsupported operand type(s) for +=: 'NoneType' and 'str'
  File "/media/alexander/DATA/w/prjs/staticfg/builder.py", line 255, in visit_func
    func_name += "." + node.attr
  File "/media/alexander/DATA/w/prjs/staticfg/builder.py", line 259, in visit_Call
    func_name = visit_func(func)
  File "/usr/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/usr/lib/python3.6/ast.py", line 263, in generic_visit
    self.visit(value)
  File "/media/alexander/DATA/w/prjs/staticfg/builder.py", line 246, in visit_Expr
    self.generic_visit(node)
  File "/usr/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/usr/lib/python3.6/ast.py", line 261, in generic_visit
    self.visit(item)
  File "/usr/lib/python3.6/ast.py", line 253, in visit
    return visitor(node)
  File "/media/alexander/DATA/w/prjs/staticfg/builder.py", line 92, in build
    self.visit(tree)
  File "/media/alexander/DATA/w/prjs/staticfg/builder.py", line 108, in build_from_src
    return self.build(name, tree)
  File "/media/alexander/DATA/w/prjs/staticfg/builder.py", line 124, in build_from_file
    return self.build_from_src(name, src)
  File "/media/alexander/DATA/w/prjs/cfg_graph.py", line 6, in <module>
    cfg = CFGBuilder().build_from_file('proba-009.py', './proba-009.py')
  File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3.6/runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "/usr/lib/python3.6/runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)

Crash if func_name is None

Description

When running code like so:

>>> from staticfg import CFGBuilder
>>> cfg = CFGBuilder().build_from_file('blah.py', './blah.py')

The CFGBuilder crashes if func_name is None.

  File "/opt/homebrew/lib/python3.12/site-packages/staticfg/builder.py", line 275, in visit_Call
    func_name = visit_func(func)
                ^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/staticfg/builder.py", line 267, in visit_func
    func_name += "." + node.attr
TypeError: unsupported operand type(s) for +=: 'NoneType' and 'str'

The relevant code:

    def visit_Call(self, node):
        def visit_func(node):
            if type(node) == ast.Name:
                return node.id
            elif type(node) == ast.Attribute:
                # Recursion on series of calls to attributes.
                func_name = visit_func(node.value)
                func_name += "." + node.attr
                return func_name

I can work around this like so:

            elif type(node) == ast.Attribute:
                # Recursion on series of calls to attributes.
                func_name = visit_func(node.value)
                if func_name is None:
                    func_name = ""
                func_name += "." + node.attr
                return func_name

but that might just be masking the problem.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.