diff options
author | Dan Liew <daniel.liew@imperial.ac.uk> | 2013-08-29 17:30:33 +0100 |
---|---|---|
committer | Dan Liew <daniel.liew@imperial.ac.uk> | 2013-09-02 16:45:47 +0100 |
commit | 4b477f8108a2a92012ff138725f6c6f26ccb23e5 (patch) | |
tree | 31349b361d8db8e03b511b67e8abb3ba470e6882 /lib/Module/KModule.cpp | |
parent | f8301282120cc3cc58d641ddc99f92b14d894692 (diff) | |
download | klee-4b477f8108a2a92012ff138725f6c6f26ccb23e5.tar.gz |
Implemented runtime check for overshift (controllable with --check-overshift
command line argument). Overshift is where a Shl, AShr or LShr has a shift width greater than the bit width of the first operand. This is undefined behaviour in LLVM so we report this as an error.
Diffstat (limited to 'lib/Module/KModule.cpp')
-rw-r--r-- | lib/Module/KModule.cpp | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/lib/Module/KModule.cpp b/lib/Module/KModule.cpp index a6047536..b646ca6e 100644 --- a/lib/Module/KModule.cpp +++ b/lib/Module/KModule.cpp @@ -322,6 +322,7 @@ void KModule::prepare(const Interpreter::ModuleOptions &opts, PassManager pm; pm.add(new RaiseAsmPass()); if (opts.CheckDivZero) pm.add(new DivCheckPass()); + if (opts.CheckOvershift) pm.add(new OvershiftCheckPass()); // FIXME: This false here is to work around a bug in // IntrinsicLowering which caches values which may eventually be // deleted (via RAUW). This can be removed once LLVM fixes this @@ -371,6 +372,8 @@ void KModule::prepare(const Interpreter::ModuleOptions &opts, */ if (opts.CheckDivZero) inlineChecks(module, "klee_div_zero_check"); + if (opts.CheckOvershift) + inlineChecks(module, "klee_overshift_check"); // Needs to happen after linking (since ctors/dtors can be modified) |