浏览代码

Kenrel: Implement two more KUBSAN checks

This patch adds the following UndefinedBehaviorSanitizer sub-options:

* signed-integer-overflow
* vla-bound
Andreas Kling 4 年之前
父节点
当前提交
d164f89ada
共有 3 个文件被更改,包括 51 次插入7 次删除
  1. 1 1
      Kernel/CMakeLists.txt
  2. 40 6
      Kernel/UBSanitizer.cpp
  3. 10 0
      Kernel/UBSanitizer.h

+ 1 - 1
Kernel/CMakeLists.txt

@@ -270,7 +270,7 @@ set(SOURCES
     ${C_SOURCES}
 )
 
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=nonnull-attribute,bool")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=nonnull-attribute,bool,vla-bound,signed-integer-overflow")
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-warning-option -DKERNEL")
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pie -fPIE -fno-rtti -ffreestanding -fbuiltin")
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-80387 -mno-mmx -mno-sse -mno-sse2")

+ 40 - 6
Kernel/UBSanitizer.cpp

@@ -36,21 +36,55 @@ extern "C" {
 static void print_location(const SourceLocation& location)
 {
     dbgln("KUBSAN: at {}, line {}, column: {}", location.filename(), location.line(), location.column());
+    dump_backtrace();
 }
 
-void __ubsan_handle_load_invalid_value(InvalidValueData&, void*);
-void __ubsan_handle_load_invalid_value(InvalidValueData& data, void*)
+void __ubsan_handle_load_invalid_value(const InvalidValueData&, void*);
+void __ubsan_handle_load_invalid_value(const InvalidValueData& data, void*)
 {
     dbgln("KUBSAN: load-invalid-value: {} ({}-bit)", data.type.name(), data.type.bit_width());
     print_location(data.location);
-    dump_backtrace();
 }
 
-void __ubsan_handle_nonnull_arg(NonnullArgData&);
-void __ubsan_handle_nonnull_arg(NonnullArgData& data)
+void __ubsan_handle_nonnull_arg(const NonnullArgData&);
+void __ubsan_handle_nonnull_arg(const NonnullArgData& data)
 {
     dbgln("KUBSAN: null pointer passed as argument {}, which is declared to never be null", data.argument_index);
     print_location(data.location);
-    dump_backtrace();
+}
+
+void __ubsan_handle_vla_bound_not_positive(const VLABoundData&, void*);
+void __ubsan_handle_vla_bound_not_positive(const VLABoundData& data, void*)
+{
+    dbgln("KUBSAN: VLA bound not positive {} ({}-bit)", data.type.name(), data.type.bit_width());
+    print_location(data.location);
+}
+
+void __ubsan_handle_add_overflow(const OverflowData&, void* lhs, void* rhs);
+void __ubsan_handle_add_overflow(const OverflowData& data, void*, void*)
+{
+    dbgln("KUBSAN: addition overflow, {} ({}-bit)", data.type.name(), data.type.bit_width());
+    print_location(data.location);
+}
+
+void __ubsan_handle_sub_overflow(const OverflowData&, void* lhs, void* rhs);
+void __ubsan_handle_sub_overflow(const OverflowData& data, void*, void*)
+{
+    dbgln("KUBSAN: subtraction overflow, {} ({}-bit)", data.type.name(), data.type.bit_width());
+    print_location(data.location);
+}
+
+void __ubsan_handle_negate_overflow(const OverflowData&, void*);
+void __ubsan_handle_negate_overflow(const OverflowData& data, void*)
+{
+    dbgln("KUBSAN: negation overflow, {} ({}-bit)", data.type.name(), data.type.bit_width());
+    print_location(data.location);
+}
+
+void __ubsan_handle_mul_overflow(const OverflowData&, void* lhs, void* rhs);
+void __ubsan_handle_mul_overflow(const OverflowData& data, void*, void*)
+{
+    dbgln("KUBSAN: multiplication overflow, {} ({}-bit)", data.type.name(), data.type.bit_width());
+    print_location(data.location);
 }
 }

+ 10 - 0
Kernel/UBSanitizer.h

@@ -74,4 +74,14 @@ struct NonnullArgData {
     int argument_index;
 };
 
+struct OverflowData {
+    SourceLocation location;
+    const TypeDescriptor& type;
+};
+
+struct VLABoundData {
+    SourceLocation location;
+    const TypeDescriptor& type;
+};
+
 }