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:
Wie eine Anweisung
load
Selbst zu finden, wenn ich Ladeanweisung finden konnte, wie kann ich zu springen% 5 Parameter zu vergleichen und entscheiden, ob es Überlauf ist?