2017-02-13 8 views
0

Ich habe keine Kenntnisse über Compiler und sehr sehr begrenzte Kenntnisse in C++ und LLVM, jetzt habe ich auf einer wichtigen Bühne stecken.Wie Überlauf durch LLVM IR überprüfen

Meine Frage ist: Wie llvm mit C++ zu verwenden, um zu überprüfen, ob es einen Überlauf gibt?

Dieser Quellcode:

int 
main(int argc, char **argv) { 
    char buffer[4] = { 0, 0, 0, 0 }; 
    return buffer[2]; 
} 

Dies ist der IR-Code:

define i32 @main(i32, i8**) #0 !dbg !6 { 
    %3 = alloca [4 x i8], align 1 
    call void @llvm.dbg.value(metadata i32 %0, i64 0, metadata !13, metadata !14), !dbg !15 
    call void @llvm.dbg.value(metadata i8** %1, i64 0, metadata !16, metadata !14), !dbg !17 
    call void @llvm.dbg.declare(metadata [4 x i8]* %3, metadata !18, metadata !14), !dbg !22 
    %4 = bitcast [4 x i8]* %3 to i8*, !dbg !22 
    call void @llvm.memset.p0i8.i64(i8* %4, i8 0, i64 4, i32 1, i1 false), !dbg !22 
    %5 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 2, !dbg !23 
    %6 = load i8, i8* %5, align 1, !dbg !23 
    %7 = sext i8 %6 to i32, !dbg !23 
    ret i32 %7, !dbg !24 
} 

Ich glaube, um diese Prüfung zu tun, müssen CallSite getInstructions() verwenden, und es scheint, dass die Antwort in dieser load Anweisung ist, aber load ist in% 6, während die Parameter in% 5 sind, weiß ich nicht:

  1. Wie eine Anweisung load

  2. Selbst zu finden, wenn ich Ladeanweisung finden konnte, wie kann ich zu springen% 5 Parameter zu vergleichen und entscheiden, ob es Überlauf ist?

Antwort

0
  1. Um zu überprüfen, ob Befehlslade ist, können Sie LoadInst* load = dyn_cast<LoadInst>(instruction) if (load != nullptr) {...}

  2. % 5 zu erhalten, rufen Sie getPointerOperand() auf dem LoadInst, wird es% 5 in diesem Fall das Rück

0

Ich empfehle Ihnen, einen Blick auf das Projekt SAFECode von der University of Illinois zu werfen.

Verwandte Themen