Skip to content

Commit 324302a

Browse files
authored
Merge pull request #492 from secure-software-engineering/f-IIAAFix
fix formal parameter bug
2 parents e962438 + 8602346 commit 324302a

4 files changed

Lines changed: 51 additions & 21 deletions

File tree

include/phasar/PhasarLLVM/DataFlowSolver/IfdsIde/Problems/IDEInstInteractionAnalysis.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,12 @@ class IDEInstInteractionAnalysisT
620620
// Generate zero value at the entry points
621621
Seeds.addSeed(&EntryPointFun->front().front(), this->getZeroValue(),
622622
bottomElement());
623+
// Generate formal parameters of entry points, e.g. main(). Formal
624+
// parameters will otherwise cause trouble by overriding alloca
625+
// instructions without being valid data-flow facts themselves.
626+
for (const auto &Arg : EntryPointFun->args()) {
627+
Seeds.addSeed(&EntryPointFun->front().front(), &Arg, BottomElement);
628+
}
623629
// Generate all global variables using generalized initial seeds
624630
for (const auto *M : this->IRDB->getAllModules()) {
625631
for (const auto &G : M->globals()) {

test/llvm_test_code/inst_interaction/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ set(Sources
99
basic_08.cpp
1010
basic_09.cpp
1111
basic_10.cpp
12+
basic_11.cpp
1213
call_01.cpp
1314
call_02.cpp
1415
call_03.cpp
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#include <string>
2+
3+
int main(int argc, char *argv[]) {
4+
int FeatureSelector = argc; // = 1
5+
switch (FeatureSelector) {
6+
case 0:
7+
return 1337;
8+
case 1:
9+
break;
10+
case 2:
11+
break;
12+
default:
13+
break;
14+
}
15+
return 0;
16+
}

unittests/PhasarLLVM/DataFlowSolver/IfdsIde/Problems/IDEInstInteractionAnalysisTest.cpp

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,10 @@ TEST_F(IDEInstInteractionAnalysisTest, HandleBasicTest_02) {
232232
"main", 24, "retval", {"6"}));
233233
GroundTruth.emplace(
234234
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
235-
"main", 24, "argc.addr", {"1", "7", "13"}));
235+
"main", 24, "argc.addr", {"7", "13"}));
236236
GroundTruth.emplace(
237237
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
238-
"main", 24, "argv.addr", {"2", "8"}));
238+
"main", 24, "argv.addr", {"8"}));
239239
GroundTruth.emplace(
240240
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
241241
"main", 24, "i", {"16", "18", "20"}));
@@ -272,7 +272,7 @@ PHASAR_SKIP_TEST(TEST_F(IDEInstInteractionAnalysisTest, HandleBasicTest_04) {
272272
"main", 23, "retval", {"13"}));
273273
GroundTruth.emplace(
274274
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
275-
"main", 23, "argc.addr", {"8", "14", "21"}));
275+
"main", 23, "argc.addr", {"14", "21"}));
276276
GroundTruth.emplace(
277277
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
278278
"main", 24, "argv.addr", {"9", "15"}));
@@ -326,10 +326,10 @@ TEST_F(IDEInstInteractionAnalysisTest, HandleBasicTest_07) {
326326
"main", 15, "retval", {"5"}));
327327
GroundTruth.emplace(
328328
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
329-
"main", 15, "argc.addr", {"1", "6"}));
329+
"main", 15, "argc.addr", {"6"}));
330330
GroundTruth.emplace(
331331
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
332-
"main", 15, "argv.addr", {"2", "7"}));
332+
"main", 15, "argv.addr", {"7"}));
333333
GroundTruth.emplace(
334334
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
335335
"main", 15, "i", {"12", "13"}));
@@ -375,10 +375,16 @@ TEST_F(IDEInstInteractionAnalysisTest, HandleBasicTest_10) {
375375
doAnalysisAndCompareResults("basic_10_cpp.ll", GroundTruth, false);
376376
}
377377

378-
// TEST_F(IDEInstInteractionAnalysisTest, RetFail) {
379-
// std::set<IIACompactResult_t> GroundTruth;
380-
// doAnalysisAndCompareResults("dump_trace_ld-te.ll", GroundTruth, false);
381-
// }
378+
TEST_F(IDEInstInteractionAnalysisTest, HandleBasicTest_11) {
379+
std::set<IIACompactResult_t> GroundTruth;
380+
GroundTruth.emplace(
381+
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
382+
"main", 20, "FeatureSelector", {"5", "7", "8", "9"}));
383+
GroundTruth.emplace(
384+
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
385+
"main", 20, "retval", {"11", "16", "18"}));
386+
doAnalysisAndCompareResults("basic_11_cpp.ll", GroundTruth, false);
387+
}
382388

383389
TEST_F(IDEInstInteractionAnalysisTest, HandleCallTest_01) {
384390
std::set<IIACompactResult_t> GroundTruth;
@@ -644,18 +650,19 @@ PHASAR_SKIP_TEST(TEST_F(IDEInstInteractionAnalysisTest, HandleRVOTest_01) {
644650
doAnalysisAndCompareResults("rvo_01_cpp.ll", GroundTruth, false);
645651
})
646652

647-
// // TEST_F(IDEInstInteractionAnalysisTest, HandleStruct_01) {
648-
// // std::set<IIACompactResult_t> GroundTruth;
649-
// // GroundTruth.emplace(
650-
// // std::tuple<std::string, size_t, std::string,
651-
// // BitVectorSet<std::string>>(
652-
// // "main", 3, "retval", {"0"}));
653-
// // doAnalysisAndCompareResults("struct_01_cpp.ll", GroundTruth, false);
654-
// // }
655-
656-
// // TEST_F(IDEInstInteractionAnalysisTest, HandleRealWorldProgram_GZipTest) {
657-
// // doAnalysisAndCompareResults("gzip-gzip-81c9fe4d09.ll", {}, false);
658-
// // }
653+
TEST_F(IDEInstInteractionAnalysisTest, HandleStruct_01) {
654+
std::set<IIACompactResult_t> GroundTruth;
655+
GroundTruth.emplace(
656+
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
657+
"main", 10, "retval", {"3"}));
658+
GroundTruth.emplace(
659+
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
660+
"main", 10, "a", {"1", "4", "5", "6", "7", "8", "13"}));
661+
GroundTruth.emplace(
662+
std::tuple<std::string, size_t, std::string, BitVectorSet<std::string>>(
663+
"main", 10, "x", {"1", "4", "5", "13"}));
664+
doAnalysisAndCompareResults("struct_01_cpp.ll", GroundTruth, false);
665+
}
659666

660667
// main function for the test case/* */
661668
int main(int Argc, char **Argv) {

0 commit comments

Comments
 (0)