Пример #1
0
    def createMain(self):
        #Main Function
        #Declaration
        z1 = c_ast.TypeDecl('args',[],c_ast.IdentifierType(['int']))
        args = c_ast.Decl('args',[],[],[],z1,None,None)
        z2= c_ast.PtrDecl([],c_ast.TypeDecl('argv',[],c_ast.IdentifierType(['char'])))
        z3=c_ast.ArrayDecl(z2,None,[])
        argv = c_ast.Decl('argv',[],[],[],z3,None,None)
        params=c_ast.ParamList([args,argv])
        mainDec=c_ast.FuncDecl(params,c_ast.TypeDecl('main',[],c_ast.IdentifierType(['int'])))
#        insertTest(functionName,varVals,varTypes)
        #Body
        ##Signal
        sigalrm=c_ast.ID(name="14")
        funcCast=c_ast.TypeDecl(declname = None,quals=[],type=c_ast.IdentifierType(['void']))
        paramCast=c_ast.ParamList([c_ast.Typename(name=None,quals=[],type=c_ast.TypeDecl(declname = None,quals=[],type=c_ast.IdentifierType(['int'])))])
        typeFunc=c_ast.PtrDecl(type=c_ast.FuncDecl(paramCast,funcCast),quals=[])        
        kchild=c_ast.Cast(to_type=c_ast.Typename(name=None, quals=[],type=typeFunc),expr=c_ast.ID(name="kill_child"))
        expressList = [sigalrm,kchild]
        signalStmt=c_ast.FuncCall(c_ast.ID(name="signal"),c_ast.ExprList(expressList))

        ##Return
        returnStmt=c_ast.Return(c_ast.Constant(type="int",value="0"))
        comp=c_ast.Compound([signalStmt,returnStmt])
        return c_ast.FuncDef(mainDec,None,comp)
Пример #2
0
Файл: CLEVER.py Проект: vhui/CC2
def make_klee_symbolic(variable_name, trackingName):
    arg1 = c_ast.UnaryOp(op='&', expr=c_ast.ID(variable_name))
    arg2 = c_ast.UnaryOp(op='sizeof', expr = c_ast.Typename(name=None, quals =[],
                                                            type= c_ast.TypeDecl(declname=None,quals=[],
                                                                                 type=c_ast.IdentifierType(names=['int']))))
    arg3 = c_ast.Constant(type='string', value='\"'+ trackingName +'\"')
    return c_ast.FuncCall(name=c_ast.ID(name = "klee_make_symbolic"), args=c_ast.ExprList(exprs=[arg1,arg2,arg3]))
Пример #3
0
 def pre_argument(self, name):
     commands = []
     commands.append(
         _generate_decl(
             name + '_int',
             c_ast.TypeDecl(name + '_int', [],
                            c_ast.IdentifierType(['unsigned', 'int']))))
     commands.append(_generate_read(name + '_int'))
     commands.append(
         c_ast.Assignment('|=', c_ast.ID(name + '_int'),
                          c_ast.Constant('int', PTR_OFFSET)))
     commands.append(
         c_ast.Decl(
             name, [], [], [],
             c_ast.PtrDecl(
                 [],
                 c_ast.TypeDecl(name, [], c_ast.IdentifierType(['void'])),
             ),
             c_ast.Cast(
                 c_ast.Typename(
                     None, [],
                     c_ast.PtrDecl([],
                                   c_ast.TypeDecl(
                                       None, [],
                                       c_ast.IdentifierType(['void'])))),
                 c_ast.ID(name + '_int')), []))
     return commands
Пример #4
0
def make_return_type(ast, owns, meta):
    normalized = meta.normalize_type(ast)
    if type(normalized.node) == c_ast.PtrDecl:
        if type(normalized.next.node) == c_ast.Struct:
            name = structName_to_className(normalized.next.node.name)
            return '%s<%d-Owning*0>' % (name, bool(owns))

        #if type(normalized.next.node) == c_ast.FuncDecl:
        #    return normalized.next.node.type.declname # TODO!!!!

    #if AST_Is_Enum(ast, meta):
    #    # TODO: move enum to Xml:: and strip off Xml-Preifx
    #    return ast.type.names[0] # TODO: handle this better

    #if AST_Is_Ptr_To_Unsigned_Char(ast, meta):
    #    return 'xmlChar* ' # TODO: handle const

    #if type(normalized.node) is c_ast.IdentifierType and normalized.node.names == ['unsigned','char']:
    #    return 'xmlChar ' # TODO!!!!!!

    ast = deepcopy(ast)

    class ClearDeclname(c_ast.NodeVisitor):
        def visit_TypeDecl(_, node):
            node.declname = ''

    ClearDeclname().visit(ast)
    name = ast_to_c(c_ast.Typename('', [], ast))
    return name
    return strip_xml_prefix(name).replace(
        'Ptr', '')  # TODO: replace(Ptr) needed?! this line needed?
Пример #5
0
def castify(node):
    '''c_ast -> c_ast'''
    # NOTE mutates declname (changes ast)
    #
    # in order to make extern calls without warnings, we must cast our register
    # arguments (which are just ints) to the argument types.  this function
    # takes ast nodes like these:
    #
    #  ArrayDecl <type>: dim_quals=[]
    #    PtrDecl <type>: quals=[]
    #      TypeDecl <type>: declname=argv, quals=[]
    #        IdentifierType <type>: names=['char']
    #
    #  TypeDecl <type>: declname=main, quals=[]
    #    IdentifierType <type>: names=['int']
    #
    # and produces these:
    #
    # Typename <params[1]>: quals=[]
    #   ArrayDecl <type>: dim_quals=[]
    #     PtrDecl <type>: quals=[]
    #       TypeDecl <type>: declname=None, quals=[]
    #         IdentifierType <type>: names=['char']
    #
    #  Typename <to_type>: quals=[]
    #    TypeDecl <type>: declname=None, quals=[]
    #      IdentifierType <type>: names=['int']
    #
    # which are suitable for use with c_ast.Cast.  (we have to make declname
    # None or CGenerator().visit will include the name--bogus in a cast)
    find_node(node, c_ast.TypeDecl).declname = None
    return c_ast.Typename(node.quals, node)
Пример #6
0
def check_value(ast_tree, ext_index, bock_item_index, var_name, func_name):
    Cast = c_ast.Cast(
        c_ast.Typename(
            None, [],
            c_ast.PtrDecl([],
                          c_ast.TypeDecl(None, [],
                                         c_ast.IdentifierType(['void'])))),
        c_ast.ID(var_name))

    func_call = c_ast.FuncCall(
        c_ast.ID('check_value'),
        c_ast.ExprList([
            c_ast.UnaryOp('&', c_ast.ID('global_log')), Cast,
            c_ast.Constant('string', '"' + var_name + '"'),
            c_ast.Constant('string', '"' + func_name + '"'),
            c_ast.Constant('int', str(len(var_name))),
            c_ast.Constant('int', str(len(func_name)))
        ]))

    new_node = c_ast.If(
        c_ast.BinaryOp('==', func_call, c_ast.Constant('int', '0')),
        c_ast.Compound([
            c_ast.FuncCall(
                c_ast.ID('printf'),
                c_ast.ExprList([
                    c_ast.Constant('string', '"%s\\n"'),
                    c_ast.Constant('string', '"Attack Detected"')
                ])),
            c_ast.FuncCall(c_ast.ID('exit'),
                           c_ast.ExprList([c_ast.Constant('int', '1')]))
        ]), None)
    return merge_ast_tree(ast_tree, ext_index, bock_item_index, new_node,
                          "insert_before")
Пример #7
0
 def anonymize_param(param: ca.Decl) -> ca.Typename:
     param = copy.deepcopy(param)
     param.name = None
     set_decl_name(param)
     return ca.Typename(name=None,
                        quals=param.quals,
                        type=param.type,
                        align=[])
Пример #8
0
 def offsetof(self, struct_name, name):
     return c_ast.FuncCall(
         c_ast.ID('offsetof'),
         c_ast.ExprList([
             c_ast.Typename(
                 None, [],
                 c_ast.TypeDecl(None, [], c_ast.Struct(struct_name, None))),
             c_ast.ID(name)
         ]))
Пример #9
0
def update_value(ast_tree, ext_index, bock_item_index, var_name, func_name,
                 var_size, func_size):
    Cast = c_ast.Cast(
        c_ast.Typename(
            None, [],
            c_ast.PtrDecl([],
                          c_ast.TypeDecl(None, [],
                                         c_ast.IdentifierType(['void'])))),
        c_ast.ID(var_name))

    new_node = c_ast.FuncCall(
        c_ast.ID('update_value'),
        c_ast.ExprList([
            c_ast.UnaryOp('&', c_ast.ID('global_log')), Cast,
            c_ast.Constant('string', '"' + var_name + '"'),
            c_ast.Constant('string', '"' + func_name + '"'),
            c_ast.Constant('int', str(var_size)),
            c_ast.Constant('int', str(func_size))
        ]))

    return merge_ast_tree(ast_tree, ext_index, bock_item_index, new_node,
                          "insert_after")
Пример #10
0
def simple_cast(ty, expr, quals=[]):
    return c_ast.Cast(c_ast.Typename(quals, ty), expr)
Пример #11
0
 def callback(node: ca.Node, is_expr: bool) -> Optional[ca.Node]:
     if node is expr:
         typedecl = ca.TypeDecl(None, [], ca.IdentifierType(new_type))
         return ca.Cast(ca.Typename(None, [], typedecl), expr)
     return None
Пример #12
0
def MakeCast(identifier_type, node):
    return c_ast.Cast(
        c_ast.Typename(None, [], c_ast.TypeDecl(None, [], identifier_type)),
        node)
Пример #13
0
 def sizeof(self, type_decl):
     anonymous_type_decl = self.anonymize_type_decl(type_decl)
     return c_ast.UnaryOp('sizeof',
                          c_ast.Typename(None, [], anonymous_type_decl))