Files
codeql/python/ql/test/query-tests/Expressions/general/expressions_test.py
2018-11-19 15:15:54 +00:00

219 lines
4.1 KiB
Python

#encoding: utf-8
def dup_key():
return { 1: -1,
1: -2,
u'a' : u'A',
u'a' : u'B'
}
def simple_func(*args, **kwrgs): pass
#Unnecessary lambdas
lambda arg0, arg1: simple_func(arg0, arg1)
lambda arg0, *arg1: simple_func(arg0, *arg1)
lambda arg0, **arg1: simple_func(arg0, **arg1)
# these lambdas are_ necessary
lambda arg0, arg1=1: simple_func(arg0, arg1)
lambda arg0, arg1: simple_func(arg0, *arg1)
lambda arg0, arg1: simple_func(arg0, **arg1)
lambda arg0, *arg1: simple_func(arg0, arg1)
lambda arg0, **arg1: simple_func(arg0, arg1)
#Non-callable called
class NonCallable(object):
pass
class MaybeCallable(Unknown, object):
pass
def call_non_callable(arg):
non = NonCallable()
non(arg)
()()
[]()
dont_know = MaybeCallable()
dont_know() # Not a violation
#Explicit call to __del__
x.__del__()
#Unhashable object
def func():
mapping = dict(); unhash = list()
return mapping[unhash]
#Using 'is' when should be using '=='
s = "Hello " + "World"
if "Hello World" is s:
print ("OK")
#This is OK in CPython, but may not be portable
s = str(7)
if "7" is s:
print ("OK")
#And some data flow
CONSTANT = 20
if x is CONSTANT:
print ("OK")
#This is OK
x = object()
y = object()
if x is y:
print ("Very surprising!")
#This is also OK
if s is None:
print ("Also surprising")
#Portable is comparisons
def f(arg):
arg is ()
arg is 0
arg is ''
#Non-container
class XIter(object):
#Support both 2 and 3 form of next, but omit __iter__ method
def __next__(self):
pass
def next(self):
pass
def non_container():
seq = XIter()
if 1 in seq:
pass
if 1 not in seq:
pass
#Container inheriting from builtin
class MyDict(dict):
pass
class MySequence(UnresolvablebaseClass):
pass
def is_container():
mapping = MyDict()
if 1 in mapping:
pass
seq = MySequence()
if 1 in seq:
pass
seq = None
if seq is not None and 1 in seq:
pass
#Equals none
def x(arg):
return arg == None
class NotMyDict(object):
def f(self):
super(MyDict, self).f()
# class defining __del__
class Test(object):
def __del__(self):
pass
# subclass
class SubTest(Test):
def __del__(self):
# This is permitted and required.
Test.__del__(self)
# This is a violation.
self.__del__()
# This is an alternate syntax for the super() call, and hence OK.
super(SubTest, self).__del__()
# This is the Python 3 spelling of the same.
super().__del__()
#Some more lambdas
#Unnecessary lambdas
lambda arg0: len(arg0)
lambda arg0: XIter.next(arg0)
class UL(object):
def f(self, x):
pass
def g(self):
return lambda x: self.f(x)
# these lambdas are necessary
lambda arg0: XIter.next(arg0, arg1)
lambda arg0: func()(arg0)
lambda arg0, arg1: arg0.meth(arg0, arg1)
#Cannot flag lists as unhashable if the object
#we are subscripting may be a numpy array
def func(maybe_numpy):
unhash = list()
return maybe_numpy[unhash]
#Guarded non-callable called
def guarded_non_callable(cond):
if cond:
val = []
else:
val = func
if hasattr(val, "__call__"):
x(1)
#ODASA-4056
def format_string(s, formatter='minimal'):
"""Format the given string using the given formatter."""
if not callable(formatter):
formatter = get_formatter_for_name(formatter)
if formatter is None:
output = s
else:
output = formatter(s)
return output
#ODASA-4614
def f(x):
d = {}
d['one'] = {}
d['two'] = 0
return x[d['two']]
#ODASA-4055
class C:
def _internal(arg):
# arg is not a C
def wrapper(args):
return arg(args)
return wrapper
@_internal
def method(self, *args):
pass
#ODASA-4689
class StrangeIndex:
def __getitem__(self,index):
return 1
x = StrangeIndex();
print(x[{'a': 'b'}])
def not_dup_key():
return { u'a' : 0,
b'a' : 0,
u"😄" : 1,
u"😅" : 2,
u"😆" : 3
}