Skip to content

Commit

Permalink
Better range checking error messages.
Browse files Browse the repository at this point in the history
Say which variable was being accessed, and print group, layer, shader names.
  • Loading branch information
lgritz committed Jun 25, 2015
1 parent fa98353 commit 180629c
Show file tree
Hide file tree
Showing 7 changed files with 122 additions and 47 deletions.
2 changes: 1 addition & 1 deletion src/liboslexec/builtindecl.h
Expand Up @@ -208,7 +208,7 @@ DECL (osl_dict_find_iss, "iXXX")
DECL (osl_dict_next, "iXi")
DECL (osl_dict_value, "iXiXLX")
DECL (osl_raytype_name, "iXX")
DECL (osl_range_check, "iiiXXi")
DECL (osl_range_check, "iiiXXXiXiXX")
DECL (osl_naninf_check, "xiXiXXiXiiX")
DECL (osl_uninit_check, "xLXXXiXiXXiXiXii")
DECL (osl_get_attribute, "iXiXXiiXX")
Expand Down
98 changes: 64 additions & 34 deletions src/liboslexec/llvm_gen.cpp
Expand Up @@ -992,11 +992,16 @@ LLVMGEN (llvm_gen_compref)
if (rop.shadingsys().range_checking()) {
if (! (Index.is_constant() && *(int *)Index.data() >= 0 &&
*(int *)Index.data() < 3)) {
llvm::Value *args[5] = { c, rop.ll.constant(3),
rop.sg_void_ptr(),
rop.ll.constant(op.sourcefile()),
rop.ll.constant(op.sourceline()) };
c = rop.ll.call_function ("osl_range_check", args, 5);
llvm::Value *args[] = { c, rop.ll.constant(3),
rop.ll.constant(Val.name()),
rop.sg_void_ptr(),
rop.ll.constant(op.sourcefile()),
rop.ll.constant(op.sourceline()),
rop.ll.constant(rop.group().name()),
rop.ll.constant(rop.layer()),
rop.ll.constant(rop.inst()->layername()),
rop.ll.constant(rop.inst()->shadername()) };
c = rop.ll.call_function ("osl_range_check", args);
ASSERT (c);
}
}
Expand Down Expand Up @@ -1031,11 +1036,16 @@ LLVMGEN (llvm_gen_compassign)
if (rop.shadingsys().range_checking()) {
if (! (Index.is_constant() && *(int *)Index.data() >= 0 &&
*(int *)Index.data() < 3)) {
llvm::Value *args[5] = { c, rop.ll.constant(3),
rop.sg_void_ptr(),
rop.ll.constant(op.sourcefile()),
rop.ll.constant(op.sourceline()) };
c = rop.ll.call_function ("osl_range_check", args, 5);
llvm::Value *args[] = { c, rop.ll.constant(3),
rop.ll.constant(Result.name()),
rop.sg_void_ptr(),
rop.ll.constant(op.sourcefile()),
rop.ll.constant(op.sourceline()),
rop.ll.constant(rop.group().name()),
rop.ll.constant(rop.layer()),
rop.ll.constant(rop.inst()->layername()),
rop.ll.constant(rop.inst()->shadername()) };
c = rop.ll.call_function ("osl_range_check", args);
}
}

Expand Down Expand Up @@ -1068,13 +1078,18 @@ LLVMGEN (llvm_gen_mxcompref)
llvm::Value *row = rop.llvm_load_value (Row);
llvm::Value *col = rop.llvm_load_value (Col);
if (rop.shadingsys().range_checking()) {
llvm::Value *args[5] = { row, rop.ll.constant(4),
rop.sg_void_ptr(),
rop.ll.constant(op.sourcefile()),
rop.ll.constant(op.sourceline()) };
row = rop.ll.call_function ("osl_range_check", args, 5);
llvm::Value *args[] = { row, rop.ll.constant(4),
rop.ll.constant(M.name()),
rop.sg_void_ptr(),
rop.ll.constant(op.sourcefile()),
rop.ll.constant(op.sourceline()),
rop.ll.constant(rop.group().name()),
rop.ll.constant(rop.layer()),
rop.ll.constant(rop.inst()->layername()),
rop.ll.constant(rop.inst()->shadername()) };
row = rop.ll.call_function ("osl_range_check", args);
args[0] = col;
col = rop.ll.call_function ("osl_range_check", args, 5);
col = rop.ll.call_function ("osl_range_check", args);
}

llvm::Value *val = NULL;
Expand Down Expand Up @@ -1108,13 +1123,18 @@ LLVMGEN (llvm_gen_mxcompassign)
llvm::Value *row = rop.llvm_load_value (Row);
llvm::Value *col = rop.llvm_load_value (Col);
if (rop.shadingsys().range_checking()) {
llvm::Value *args[5] = { row, rop.ll.constant(4),
rop.sg_void_ptr(),
rop.ll.constant(op.sourcefile()),
rop.ll.constant(op.sourceline()) };
row = rop.ll.call_function ("osl_range_check", args, 5);
llvm::Value *args[] = { row, rop.ll.constant(4),
rop.ll.constant(Result.name()),
rop.sg_void_ptr(),
rop.ll.constant(op.sourcefile()),
rop.ll.constant(op.sourceline()),
rop.ll.constant(rop.group().name()),
rop.ll.constant(rop.layer()),
rop.ll.constant(rop.inst()->layername()),
rop.ll.constant(rop.inst()->shadername()) };
row = rop.ll.call_function ("osl_range_check", args);
args[0] = col;
col = rop.ll.call_function ("osl_range_check", args, 5);
col = rop.ll.call_function ("osl_range_check", args);
}

llvm::Value *val = rop.llvm_load_value (Val, 0, 0, TypeDesc::TypeFloat);
Expand Down Expand Up @@ -1165,12 +1185,17 @@ LLVMGEN (llvm_gen_aref)
if (rop.shadingsys().range_checking()) {
if (! (Index.is_constant() && *(int *)Index.data() >= 0 &&
*(int *)Index.data() < Src.typespec().arraylength())) {
llvm::Value *args[5] = { index,
rop.ll.constant(Src.typespec().arraylength()),
rop.sg_void_ptr(),
rop.ll.constant(op.sourcefile()),
rop.ll.constant(op.sourceline()) };
index = rop.ll.call_function ("osl_range_check", args, 5);
llvm::Value *args[] = { index,
rop.ll.constant(Src.typespec().arraylength()),
rop.ll.constant(Src.name()),
rop.sg_void_ptr(),
rop.ll.constant(op.sourcefile()),
rop.ll.constant(op.sourceline()),
rop.ll.constant(rop.group().name()),
rop.ll.constant(rop.layer()),
rop.ll.constant(rop.inst()->layername()),
rop.ll.constant(rop.inst()->shadername()) };
index = rop.ll.call_function ("osl_range_check", args);
}
}

Expand Down Expand Up @@ -1204,12 +1229,17 @@ LLVMGEN (llvm_gen_aassign)
if (rop.shadingsys().range_checking()) {
if (! (Index.is_constant() && *(int *)Index.data() >= 0 &&
*(int *)Index.data() < Result.typespec().arraylength())) {
llvm::Value *args[5] = { index,
rop.ll.constant(Result.typespec().arraylength()),
rop.sg_void_ptr(),
rop.ll.constant(op.sourcefile()),
rop.ll.constant(op.sourceline()) };
index = rop.ll.call_function ("osl_range_check", args, 5);
llvm::Value *args[] = { index,
rop.ll.constant(Result.typespec().arraylength()),
rop.ll.constant(Result.name()),
rop.sg_void_ptr(),
rop.ll.constant(op.sourcefile()),
rop.ll.constant(op.sourceline()),
rop.ll.constant(rop.group().name()),
rop.ll.constant(rop.layer()),
rop.ll.constant(rop.inst()->layername()),
rop.ll.constant(rop.inst()->shadername()) };
index = rop.ll.call_function ("osl_range_check", args);
}
}

Expand Down
15 changes: 11 additions & 4 deletions src/liboslexec/shadingsys.cpp
Expand Up @@ -2956,13 +2956,20 @@ osl_uninit_check (long long typedesc_, void *vals_,


OSL_SHADEOP int
osl_range_check (int indexvalue, int length,
void *sg, const void *sourcefile, int sourceline)
osl_range_check (int indexvalue, int length, const char *symname,
void *sg, const void *sourcefile, int sourceline,
const char *groupname, int layer, const char *layername,
const char *shadername)
{
if (indexvalue < 0 || indexvalue >= length) {
ShadingContext *ctx = (ShadingContext *)((ShaderGlobals *)sg)->context;
ctx->error ("Index [%d] out of range [0..%d]: %s:%d",
indexvalue, length-1, USTR(sourcefile), sourceline);
ctx->error ("Index [%d] out of range %s[0..%d]: %s:%d"
" (group %s, layer %d %s, shader %s)",
indexvalue, USTR(symname), length-1,
USTR(sourcefile), sourceline,
groupname ? groupname : "<unnamed group>", layer,
(layername && layername[0]) ? layername : "<unnamed layer>",
USTR(shadername));
if (indexvalue >= length)
indexvalue = length-1;
else
Expand Down
20 changes: 20 additions & 0 deletions testsuite/array-range/ref/out-alt.txt
@@ -0,0 +1,20 @@
Compiled test.osl -> test.oso
constant index:
reading:
array[1] = 1
ERROR: Index [10] out of range $const1[0..4]: test.osl:8 (group <unnamed group>, layer 0 <unnamed layer>, shader test)
array[10] = 4
writing:
ERROR: Index [10] out of range array[0..4]: test.osl:10 (group <unnamed group>, layer 0 <unnamed layer>, shader test)
variable index:
reading:
array[0] = 0
array[1] = 1
array[2] = 2
array[3] = 3
array[4] = 42
ERROR: Index [5] out of range array[0..4]: test.osl:15 (group <unnamed group>, layer 0 <unnamed layer>, shader test)
array[5] = 42
writing:
ERROR: Index [5] out of range array[0..4]: test.osl:19 (group <unnamed group>, layer 0 <unnamed layer>, shader test)

8 changes: 4 additions & 4 deletions testsuite/array-range/ref/out.txt
Expand Up @@ -2,19 +2,19 @@ Compiled test.osl -> test.oso
constant index:
reading:
array[1] = 1
ERROR: Index [10] out of range [0..4]: test.osl:8
ERROR: Index [10] out of range array[0..4]: test.osl:8 (group <unnamed group>, layer 0 <unnamed layer>, shader test)
array[10] = 4
writing:
ERROR: Index [10] out of range [0..4]: test.osl:10
ERROR: Index [10] out of range array[0..4]: test.osl:10 (group <unnamed group>, layer 0 <unnamed layer>, shader test)
variable index:
reading:
array[0] = 0
array[1] = 1
array[2] = 2
array[3] = 3
array[4] = 42
ERROR: Index [5] out of range [0..4]: test.osl:15
ERROR: Index [5] out of range array[0..4]: test.osl:15 (group <unnamed group>, layer 0 <unnamed layer>, shader test)
array[5] = 42
writing:
ERROR: Index [5] out of range [0..4]: test.osl:19
ERROR: Index [5] out of range array[0..4]: test.osl:19 (group <unnamed group>, layer 0 <unnamed layer>, shader test)

18 changes: 18 additions & 0 deletions testsuite/component-range/ref/out-alt.txt
@@ -0,0 +1,18 @@
Compiled test.osl -> test.oso
constant index:
reading:
V[1] = 1
ERROR: Index [10] out of range $const1[0..2]: test.osl:8 (group <unnamed group>, layer 0 <unnamed layer>, shader test)
V[10] = 2
writing:
ERROR: Index [10] out of range V[0..2]: test.osl:10 (group <unnamed group>, layer 0 <unnamed layer>, shader test)
variable index:
reading:
V[0] = 0
V[1] = 1
V[2] = 42
ERROR: Index [3] out of range V[0..2]: test.osl:15 (group <unnamed group>, layer 0 <unnamed layer>, shader test)
V[3] = 42
writing:
ERROR: Index [3] out of range V[0..2]: test.osl:19 (group <unnamed group>, layer 0 <unnamed layer>, shader test)

8 changes: 4 additions & 4 deletions testsuite/component-range/ref/out.txt
Expand Up @@ -2,17 +2,17 @@ Compiled test.osl -> test.oso
constant index:
reading:
V[1] = 1
ERROR: Index [10] out of range [0..2]: test.osl:8
ERROR: Index [10] out of range V[0..2]: test.osl:8 (group <unnamed group>, layer 0 <unnamed layer>, shader test)
V[10] = 2
writing:
ERROR: Index [10] out of range [0..2]: test.osl:10
ERROR: Index [10] out of range V[0..2]: test.osl:10 (group <unnamed group>, layer 0 <unnamed layer>, shader test)
variable index:
reading:
V[0] = 0
V[1] = 1
V[2] = 42
ERROR: Index [3] out of range [0..2]: test.osl:15
ERROR: Index [3] out of range V[0..2]: test.osl:15 (group <unnamed group>, layer 0 <unnamed layer>, shader test)
V[3] = 42
writing:
ERROR: Index [3] out of range [0..2]: test.osl:19
ERROR: Index [3] out of range V[0..2]: test.osl:19 (group <unnamed group>, layer 0 <unnamed layer>, shader test)

0 comments on commit 180629c

Please sign in to comment.