新的MyAnalysis ()
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第101行
此文件是用于编写自定义Jalangi2分析的模板。只需复制该文件并重写您需要在分析中实现的回调。应从文件中删除其他回调。
在以下方法(也称为回调)中,可以选择不返回任何东西。如果所有的回调函数都不返回,我们将得到一个被动分析,其中具体的执行发生未修改,回调可以用于观察执行。可以选择在一些回调中返回具有指定属性的合适对象来修改具体执行的行为。例如,可以将MyAnalysis#putFieldPre返回的对象的skip属性设置为true,以跳过实际的putField操作。类似地,可以设置从MyAnalysis#write回调返回的对象的结果字段来修改实际写入变量的值。从MyAnalysis#条件回调返回的对象的结果字段可以被适当地设置为改变程序执行的控制流程。在MyAnalysis#functionExit和MyAnalysis#scriptExit中,可以将返回的对象的isBacktrack属性设置为true,从头开始重新执行函数体。结合改变程序控制流程的能力,我们可以探索符号执行中函数的不同路径。可以将返回的对象的isBacktrack属性设置为true,从头开始重新执行函数的正文。结合改变程序控制流程的能力,我们可以探索符号执行中函数的不同路径。可以将返回的对象的isBacktrack属性设置为true,从头开始重新执行函数的正文。结合改变程序控制流程的能力,我们可以探索符号执行中函数的不同路径。
请注意,如果调用process.exit(),则执行异常终止,并将跳过MyAnalysis#endExecution的回调 。
分析可以使用存储的全局对象访问源映射,该映射将指令标识符映射到源位置J$.smap。Jalangi 2为sid运行时加载的每个JavaScript脚本分配一个唯一的id 。 J$.smap将每个映射sid到一个对象,比如 iids,包含id的脚本的源映射信息sid。 iids具有以下属性:("originalCodeFileName"存储原始脚本文件"instrumentedCodeFileName"的路径),(存储测试脚本文件的路径) "url"(如果在使用-url选项进行测试时设置脚本的URL,则是可选的) , "evalSid"(存储调用eval的脚本的sid,以防当前脚本来自eval函数调用) "evalIid"(eval如果当前脚本来自 eval函数调用,"nBranches"则为函数调用),(脚本中的条件语句数)和"code"(如果使用--inlineSource选项检测代码时,表示原始脚本代码的字符串) 。iids还映射每个iid(代表指令id,分配给Jalangi2插入的每个回调函数的唯一ID)到包含的数组[beginLineNumber,beginColumnNumber, endLineNumber, endColumnNumber]。如果使用-inlineIID选项对代码进行了检测,则从iids到数组的映射仅可用。和(表示原始脚本代码的字符串,如果代码使用--inlineSource选项进行了检测)。还映射每个(代表指令id,分配给Jalangi2插入的每个回调函数的唯一ID)到包含的数组。如果使用-inlineIID选项对代码进行了检测,则从iids到数组的映射仅可用。和(表示原始脚本代码的字符串,如果代码使用--inlineSource选项进行了检测)。 还映射每个(代表指令id,分配给Jalangi2插入的每个回调函数的唯一ID)到包含的数组 。如果使用-inlineIID选项对代码进行了检测,则从iids到数组的映射仅可用。
在下面描述的每个回调中,iid表示脚本中回调的唯一静态指令ID。两个不同脚本中插入的两个回调函数可能具有相同的iid。在回调函数中,可以使用当前脚本ID访问J$.sid。可以调用J$.getGlobalIID(iid)获取一个被称为 giid静态标识整个程序回调的字符串。 J$.getGlobalIID(iid)返回字符串J$.sid+":"+iid。 J$.iidToLocation(giid)返回一个包含原始脚本文件路径的字符串,其中giid插入了回调的代码片段的开始和结束行号和列号。
许多样本分析可以在../src/js/sample_analyses/找到。有关运行分析的说明,请参阅../README.md。
方法
_return (iid,val){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第385行
在使用return关键字从函数返回值之前调用此回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
val | * | 要退回的价值 |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回一个对象,则返回的值将替换为存储在该对象的result属性中的值。 |
_throw (iid,val){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第397行
在使用throw关键字抛出一个值之前调用此回调函数。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
val | * | 要抛出的价值 |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回一个对象,则抛出的值将替换为存储在该对象的result属性中的值。 |
_with (iid,val){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第409行
当执行with语句时 调用此回调
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
val | * | 用作一个参数值与 |
返回:
类型 | 描述 |
对象| 未定义 | -如果返回一个对象,要使用在值与被替换为存储在所述值结果的对象的属性。 |
binary(iid,op,left,right,result,isOpAssign,isSwitchCaseComparison,isComputed){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第513行
这个回调在二进制操作之后被调用。二进制操作包括+, - ,*,/,%,&,|,^,<<,>>,>>>,<,>,<=,> =,==,!=,=== ==,instanceof,delete,in。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
op | 串 | 要执行的操作 |
left | * | 左操作数 |
right | * | 右操作数 |
result | * | 二进制运算的结果 |
isOpAssign | 布尔值 | 如果二进制操作是表单的一部分,则为真 x op= e |
isSwitchCaseComparison | 布尔值 | 如果二进制操作是将判别式与switch语句中的结果进行比较的一部分,则为真。 |
isComputed | 布尔值 | 如果操作是表单delete x[p],则为真,否则为false(即使表单的操作delete x.p) |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回一个对象,二进制操作的结果将替换为存储在对象的result属性中的值。 |
binaryPre (iid,op,left,right,isOpAssign,isSwitchCaseComparison,isComputed){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第491行
这个回调在二进制操作之前被调用。二进制操作包括+, - ,*,/,%,&,|,^,<<,>>,>>>,<,>,<=,> =,==,!=,=== ==,instanceof,delete,in。delete x 由于此操作无法反射执行,无回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
op | 串 | 要执行的操作 |
left | * | 左操作数 |
right | * | 右操作数 |
isOpAssign | 布尔值 | 如果二进制操作是表单的一部分,则为真 x op= e |
isSwitchCaseComparison | 布尔值 | 如果二进制操作是将判别式与switch语句中的结果进行比较的一部分,则为真。 |
isComputed | 布尔值 | 如果操作是表单delete x[p],则为真,否则为false(即使表单的操作delete x.p) |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回一个对象,并且 skip属性为true,则跳过二进制操作。如果返回对象,则原始op,left和right将被替换为返回的对象。 |
conditional(iid,结果){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第555行
这种回调在分支之后进行条件检查后调用。分支可以发生在各种语句中,包括if-then-else,switch-case,while,for,||,&&,?
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
result | * | 条件表达式的值 |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回对象,则条件表达式的结果将替换为存储在对象的result属性中的值。 |
declare (iid,name,val,isArgument,argumentIndex,isCatchParam){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第266行
对于范围中声明的每个局部变量,对于每个形式参数,对于使用函数语句定义的每个函数,参数 变量以及在catch语句中传递的形式参数,在此范围的开头都会触发此回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
name | 串 | 声明变量的名称 |
val | * | 声明的变量的初始值。变量可以是局部变量,函数参数,catch参数,参数或使用函数语句定义的函数。与声明的变量VAR都未定义作为初始值,并且不能从这个回调返回不同的值被改变。在执行函数的开始, 在arguments变量上调用一个声明回调函数。 |
isArgument | 布尔值 | 如果变量是参数或形式参数,则为真。 |
argumentIndex | 数 | 函数调用中参数的索引。指数从0开始。如果变量不是形式参数,则argumentIndex为-1。 |
isCatchParam | 布尔值 | 如果变量是catch语句的参数,则为True。 |
返回:
类型 | 描述 |
对象| 未定义 | - 如果函数返回一个对象,那么原始初始值将替换为存储在对象的result属性中的值。这不适用于使用var声明的局部变量。 |
endExecution (){undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第601行
当node.js中执行终止时,调用此回调。在浏览器环境中,如果使用ChainedAnalyses.js或ChainedAnalysesNoCheck.js并按Alt-Shift-T,则调用回调。
退货:
类型 | 描述 |
未定义 | - 忽略任何返回值 |
endExpression (iid){undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第592行
当一个表达式被计算并且其值被丢弃时,这个回调被调用。例如,当表达式语句完成其执行时,将调用此回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
返回:
类型 | 描述 |
未定义 | - 忽略任何返回值 |
forinObject (iid,val){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第241行
当使用for-in循环来迭代对象的属性时,将调用此回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
val | * | 其属性在for-in循环中迭代的对象。 |
返回:
类型 | 描述 |
对象| 未定义 | - 如果函数返回一个对象,那么其属性正被迭代的原始对象将被存储在返回对象的result属性中的值替换。 |
例
for (x in y) { }
// the above call roughlygets instrumented as follows:
var aret =analysis.forinObject(iid, y);
if (aret) {
y = aret.result;
}
for (x in y) {}
functionEnter (iid,f,dis,args){undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第422行
在函数正文启动之前调用此回调函数。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
f | 功能 | 其身体即将被执行的功能对象 |
dis | * | 所述的值这个变量函数体 |
args | 数组 | 调用函数的参数列表 |
返回:
类型 | 描述 |
未定义 | - 忽略任何返回值 |
functionExit (iid,returnVal,wrappedExceptionVal){目的}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第440行
当函数体的执行完成时,将调用此回调
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
returnVal | * | 该函数返回的值 |
wrappedExceptionVal | 对象 | 未定义 | 如果这个参数是一个对象,那么函数执行就会抛出一个未捕获的异常,异常被存储在参数的异常 属性中 |
返回:
类型 | 描述 |
目的 | 如果返回一个对象,那么实际的returnVal和wrappedExceptionVal.exception将被替换为返回的对象。如果返回一个对象并设置了属性isBacktrack,那么控制流将返回到函数体的开头,而不是返回给调用者。属性isBacktrack可以设置为true,以重复执行功能体,如同在MultiSE符号执行。 |
getField (iid,base,offset,val,isComputed,isOpAssign,isMethodCall){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第305行
在访问对象的属性后调用此回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
base | * | 基础对象 |
offset | 字符串 | * | 属性 |
val | * | 的价值 base[offset] |
isComputed | 布尔值 | 如果使用方括号访问属性,则为true。例如, 如果get字段操作是o [p],则isComputed为真, 如果get字段操作为op,则为false |
isOpAssign | 布尔值 | 如果操作是形式,则为真 o.p op= e |
isMethodCall | 布尔值 | 如果get字段操作是方法调用的一部分(例如op()),则为True |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回一个对象,则get字段操作的值将替换为存储在该对象的result属性中的值。 |
getFieldPre (iid,base,offset,isComputed,isOpAssign,isMethodCall){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第286行
在访问对象的属性之前调用此回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
base | * | 基础对象 |
offset | 字符串 | * | 属性 |
isComputed | 布尔值 | 如果使用方括号访问属性,则为true。例如, 如果get字段操作是o [p],则isComputed为真, 如果get字段操作为op,则为false |
isOpAssign | 布尔值 | 如果操作是形式,则为真 o.p op= e |
isMethodCall | 布尔值 | 如果get字段操作是方法调用的一部分(例如op()),则为True |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回对象并且对象的skip 属性为true,则跳过get字段操作。如果返回一个对象,则原始基础和 偏移量将从返回的对象替换。 |
instrumentCode (iid,newCode,newAst){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第581行
在作为参数传递给eval或Function进行检测的字符串之后调用此回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
newCode | * | 仪器代码 |
newAst | 目的 | AST的仪器化代码 |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回一个对象,则将检测到的代码替换为存储在对象的result属性中的值。 |
instrumentCodePre (iid,code){目的}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第568行
在作为参数传递给eval或Function进行检测的字符串之前调用此回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
code | * | 将要检测的代码 |
返回:
类型 | 描述 |
目的 | - 如果返回一个对象,并且 skip属性为true,则跳过代码检测。如果返回一个对象,原始代码将被替换为返回的对象。 |
invokeFun (iid,f,base,args,result,isConstructor,isMethod,functionIid){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第188行
这个回调在函数,方法或构造函数调用后调用。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
f | 功能 | 被调用的函数对象 |
base | * | 函数f的接收者对象 |
args | 数组 | 传递给f的参数数组 |
result | * | 调用返回的值 |
isConstructor | 布尔值 | 如果f被调用为构造函数,则为真 |
isMethod | 布尔值 | 如果f被调用为方法,则为真 |
functionIid | 数 | 当执行函数f时, 传递给回调MyAnalysis#functionEnter的iid(即唯一指令标识符) 。 functionIid可以被视为函数f的静态标识符。请注意,给定的功能代码块可以创建几个函数对象,但每个这样的对象都有一个通用的函数Iid,这是在函数执行时传递给MyAnalysis#functionEnter的iid 。 |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回一个对象,则调用的函数的返回值将被替换为存储在该对象的result属性中的值。这样可以更改实际函数调用返回的值。 |
例
x = y.f(a, b, c)
// the above call roughlygets instrumented as follows:
var skip = false;
var aret =analysis.invokeFunPre(113, f, y, [a, b, c], false, true);
if (aret) {
f = aret.f;
y = aret.y;
args = aret.args;
skip = aret.skip
}
if (!skip) {
result =f.apply(y, args);
}
aret = analysis.invokeFun(117,f, y, args, result, false, true);
if (aret) {
x = aret.result
} else {
x = result;
}
invokeFunPre (iid,f,base,args,isConstructor,isMethod,functionIid){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第141行
这个回调在函数,方法或构造函数调用之前被调用。请注意,方法调用还会触发MyAnalysis#getFieldPre和 MyAnalysis#getField回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
f | 功能 | 要调用的函数对象 |
base | 目的 | 函数f的接收者对象 |
args | 数组 | 传递给f的参数数组 |
isConstructor | 布尔值 | 如果f被调用为构造函数,则为真 |
isMethod | 布尔值 | 如果f被调用为方法,则为真 |
functionIid | 数 | 当执行函数f时, 传递给回调MyAnalysis#functionEnter的iid(即唯一指令标识符) 。的functionIid可以被视为该功能的静态标识符˚F。请注意,给定的功能代码块可以创建几个函数对象,但每个这样的对象都有一个通用的函数Iid,这是在函数执行时传递给MyAnalysis#functionEnter的iid 。 |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回对象并且对象的skip属性为true,则跳过调用操作。如果返回对象,则原始f,base和arg将被返回的对象替换。 |
例
y.f(a, b, c)
// the above call roughlygets instrumented as follows:
var skip = false;
var aret =analysis.invokeFunPre(113, f, y, [a, b, c], false, true);
if (aret) {
f = aret.f;
y = aret.y;
args = aret.args;
skip = aret.skip
}
if (!skip) {
f.apply(y, args);
}
literal(iid,val,hasGetterSetter){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第216行
这个回调是在创建一个文字后调用的。文字可以是函数文字,对象文字,数组文字,数字,字符串,布尔值,正则表达式,null,NaN,Infinity或未定义。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
val | * | 字面值 |
hasGetterSetter | 布尔值 | 如果文字是一个对象,并且对象定义了getter和setter,则为true |
返回:
类型 | 描述 |
对象| 未定义 | - 如果函数返回一个对象,那么原始文本值将替换为存储在对象的result属性中的值。 |
例
x = "Hello"
// the above call roughlygets instrumented as follows:
var result ="Hello";
var aret =analysis.literal(201, result, false);
if (aret) {
result = aret.result;
}
x = result;
onReady (cb)
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第632行
如果您的分析正在node.js上运行(即,通过direct.js或jalangi.js命令),onReady是有用的,并且需要在检测到的程序启动之前完成一些异步初始化。在这种情况下,初始化完成后,调用cb函数开始执行被检测的程序。请注意,这种回调在浏览器中无效,因为Jalangi无法控制检测程序何时运行。
名称 | 类型 | 描述 |
cb |
putField (iid,base,offset,val,isComputed,isOpAssign){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第342行
在写入对象的属性后调用此回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
base | * | 基础对象 |
offset | * | 属性 |
val | * | 要存储的值 base[offset] |
isComputed | 布尔值 | 如果使用方括号访问属性,则为true。例如, 如果get字段操作是o [p],则isComputed为真, 如果get字段操作为op,则为false |
isOpAssign | 布尔值 | 如果操作是形式,则为真 o.p op= e |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回对象,则put字段操作的结果将替换为存储在对象的result属性中的值。 |
putFieldPre (iid,base,offset,val,isComputed,isOpAssign){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第324行
在对象的属性写入之前调用此回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
base | * | 基础对象 |
offset | * | 属性 |
val | * | 要存储的值 base[offset] |
isComputed | 布尔值 | 如果使用方括号访问属性,则为true。例如, 如果get字段操作是o [p],则isComputed为真, 如果get字段操作为op,则为false |
isOpAssign | 布尔值 | 如果操作是形式,则为真 o.p op= e |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回一个对象,并且skip 属性为true,则跳过put字段操作。如果返回一个对象,原始的base,offset和 val将被替换为返回的对象。 |
read (iid,name,val,isGlobal,isScriptLocal){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第357行
读取变量后调用此回调。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
name | 串 | 正在读取的变量的名称 |
val | * | 从变量读取值 |
isGlobal | 布尔值 | 如果变量未使用var声明(如控制台),则为True |
isScriptLocal | 布尔值 | 如果变量在全局范围内使用var声明,则为真 |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回一个对象,则读取操作的结果将替换为存储在对象的result属性中的值。 |
runInstrumentedFunctionBody (iid,f,functionIid){boolean}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第618行
仅当使用J $ .Config.ENABLE_SAMPLING =true进行调用时才调用此回调。在执行函数,方法或构造函数的正文之前调用此回调函数,如果返回true,则执行检测函数体,否则执行unlstrumented函数体
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
f | 功能 | 正在执行正文的功能 |
functionIid | 数 | 当执行函数f时, 传递给回调MyAnalysis#functionEnter的iid(即唯一指令标识符) 。的functionIid可以被视为该功能的静态标识符˚F。请注意,给定的功能代码块可以创建几个函数对象,但每个这样的对象都有一个通用的函数Iid,这是在函数执行时传递给MyAnalysis#functionEnter的iid 。 |
返回:
类型 | 描述 |
布尔值 | - 如果返回true,则执行仪表功能体,否则执行未测量的功能体。 |
scriptEnter (iid,instrumentedFileName,originalFileName)
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第451行
在执行JavaScript文件之前调用此回调
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
instrumentedFileName | 串 | 仪表化脚本文件的名称 |
originalFileName | 串 | 原始脚本文件的名称 |
scriptExit (iid,wrappedExceptionVal){目的}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第468行
当JavaScript文件的执行完成时,将调用此回调
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
wrappedExceptionVal | 对象 | 未定义 | 如果此参数是一个对象,则脚本执行会引发未捕获的异常,异常存储在参数的异常 属性中 |
返回:
类型 | 描述 |
目的 | - 如果返回一个对象,那么实际的wrappedExceptionVal.exception将被替换为返回的对象。如果返回一个对象并设置了属性isBacktrack,那么控制流将返回到脚本正文的开头。属性 isBacktrack可以设置为true,以反复执行脚本体,就像MultiSE符号执行一样。 |
unary(iid,op,left,result){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第542行
这个回调在一次操作后调用。一元操作包括+, - ,〜,!,typeof,void。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
op | 串 | 要执行的操作 |
left | * | 左操作数 |
result | * | 一次性操作的结果 |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回一个对象,则一元操作的结果将替换为存储在对象的result属性中的值。 |
unaryPre (iid,op,left){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第527行
这种回调在一元操作之前被调用。一元操作包括+, - ,〜,!,typeof,void。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
op | 串 | 要执行的操作 |
left | * | 左操作数 |
返回:
类型 | 描述 |
对象| 未定义 | 如果返回一个对象,并且 skip属性为true,则跳过一元操作。 如果返回对象,则原始op和left将被替换为返回对象。 |
write (iid,name,val,lhs,isGlobal,isScriptLocal){Object |undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第373行
在写入变量之前调用此回调函数。
名称 | 类型 | 描述 |
iid | 数 | 此回调的静态唯一指令标识符 |
name | 串 | 正在读取的变量的名称 |
val | * | 要写入变量的值 |
lhs | * | 在写入操作之前存储在变量中的值 |
isGlobal | 布尔值 | 如果变量未使用var声明(如控制台),则为True |
isScriptLocal | 布尔值 | 如果变量在全局范围内使用var声明,则为真 |
返回:
类型 | 描述 |
对象| 未定义 | - 如果返回对象,则写入操作的结果将替换为存储在对象的result属性中的值。 |