mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
fix safety for sentinel-slicing floats
This commit is contained in:
parent
8918cb06fc
commit
8d73703d52
2 changed files with 34 additions and 1 deletions
|
|
@ -1425,7 +1425,12 @@ static void add_sentinel_check(CodeGen *g, LLVMValueRef sentinel_elem_ptr, ZigVa
|
|||
LLVMValueRef expected_sentinel = gen_const_val(g, sentinel, "");
|
||||
|
||||
LLVMValueRef actual_sentinel = gen_load_untyped(g, sentinel_elem_ptr, 0, false, "");
|
||||
LLVMValueRef ok_bit = LLVMBuildICmp(g->builder, LLVMIntEQ, actual_sentinel, expected_sentinel, "");
|
||||
LLVMValueRef ok_bit;
|
||||
if (sentinel->type->id == ZigTypeIdFloat) {
|
||||
ok_bit = LLVMBuildFCmp(g->builder, LLVMRealOEQ, actual_sentinel, expected_sentinel, "");
|
||||
} else {
|
||||
ok_bit = LLVMBuildICmp(g->builder, LLVMIntEQ, actual_sentinel, expected_sentinel, "");
|
||||
}
|
||||
|
||||
LLVMBasicBlockRef fail_block = LLVMAppendBasicBlock(g->cur_fn_val, "SentinelFail");
|
||||
LLVMBasicBlockRef ok_block = LLVMAppendBasicBlock(g->cur_fn_val, "SentinelOk");
|
||||
|
|
|
|||
|
|
@ -1,6 +1,34 @@
|
|||
const tests = @import("tests.zig");
|
||||
|
||||
pub fn addCases(cases: *tests.CompareOutputContext) void {
|
||||
cases.addRuntimeSafety("slice sentinel mismatch - optional pointers",
|
||||
\\const std = @import("std");
|
||||
\\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn {
|
||||
\\ if (std.mem.eql(u8, message, "sentinel mismatch")) {
|
||||
\\ std.process.exit(126); // good
|
||||
\\ }
|
||||
\\ std.process.exit(0); // test failed
|
||||
\\}
|
||||
\\pub fn main() void {
|
||||
\\ var buf: [4]?*i32 = undefined;
|
||||
\\ const slice = buf[0..3 :null];
|
||||
\\}
|
||||
);
|
||||
|
||||
cases.addRuntimeSafety("slice sentinel mismatch - floats",
|
||||
\\const std = @import("std");
|
||||
\\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn {
|
||||
\\ if (std.mem.eql(u8, message, "sentinel mismatch")) {
|
||||
\\ std.process.exit(126); // good
|
||||
\\ }
|
||||
\\ std.process.exit(0); // test failed
|
||||
\\}
|
||||
\\pub fn main() void {
|
||||
\\ var buf: [4]f32 = undefined;
|
||||
\\ const slice = buf[0..3 :1.2];
|
||||
\\}
|
||||
);
|
||||
|
||||
cases.addRuntimeSafety("pointer slice sentinel mismatch",
|
||||
\\const std = @import("std");
|
||||
\\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue