Skip to content

Commit 48ebd6c

Browse files
authored
Use bounds(unknown) rather than an locally-undefined variable copied from function parameter (#717)
* implement trivial fix for bounds * change to bounds(unknown) and regenerate tests * add test from issue
1 parent 8170d2f commit 48ebd6c

31 files changed

+114
-79
lines changed

clang/lib/3C/CastPlacement.cpp

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -172,33 +172,30 @@ CastPlacementVisitor::getCastString(ConstraintVariable *Dst,
172172
case CAST_TO_WILD:
173173
return std::make_pair("((" + Dst->getRewritableOriginalTy() + ")", ")");
174174
case CAST_TO_CHECKED: {
175+
// Needed as default to TypeVar branch below, reset otherwise.
176+
std::string Type = "_Ptr<";
175177
std::string Suffix = ")";
176178
if (const auto *DstPVC = dyn_cast<PVConstraint>(Dst)) {
177179
assert("Checked cast not to a pointer" && !DstPVC->getCvars().empty());
178180
ConstAtom *CA =
179181
Info.getConstraints().getAssignment(DstPVC->getCvars().at(0));
180182

181-
// Writing an _Assume_bounds_cast to an array type requires inserting
182-
// the bounds for destination array. These can come from the source
183-
// code or the infered bounds. If neither source is available, use empty
184-
// bounds.
185-
if (isa<ArrAtom>(CA) || isa<NTArrAtom>(CA)) {
186-
std::string Bounds = "";
187-
if (DstPVC->srcHasBounds())
188-
Bounds = DstPVC->getBoundsStr();
189-
else if (DstPVC->hasBoundsKey())
190-
Bounds = ABRewriter.getBoundsString(DstPVC, nullptr, true);
191-
if (Bounds.empty())
192-
Bounds = "byte_count(0)";
193-
194-
Suffix = ", " + Bounds + ")";
183+
// TODO: Writing an _Assume_bounds_cast to an array type requires
184+
// inserting the bounds for destination array. But the names used in src
185+
// and dest may be different, so we need more sophisticated code to
186+
// convert to local variable names. Use unknown bounds for now.
187+
if (isa<ArrAtom>(CA)) {
188+
Type = "_Array_ptr<";
189+
Suffix = ", bounds(unknown))";
190+
} else if (isa<NTArrAtom>(CA)) {
191+
Type = "_Nt_array_ptr<";
192+
Suffix = ", bounds(unknown))";
195193
}
196194
}
197195
// The destination's type may be generic, which would have an out-of-scope
198196
// type var, so use the already analysed local type var instead
199-
std::string Type;
200197
if (TypeVar != nullptr) {
201-
Type = "_Ptr<" +
198+
Type +=
202199
TypeVar->mkString(Info.getConstraints(),
203200
MKSTRING_OPTS(EmitName = false, EmitPointee = true)) +
204201
">";

clang/test/3C/b_tests/b1_allsafe.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ int *foo() {
3131
//CHECK: _Ptr<int> y = &sy;
3232
int *z = sus(x, y);
3333
//CHECK_NOALL: _Ptr<int> z = sus(x, y);
34-
//CHECK_ALL: _Ptr<int> z = sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y);
34+
//CHECK_ALL: _Ptr<int> z = sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y);
3535
*z = *z + 1;
3636
return z;
3737
}
@@ -47,6 +47,6 @@ int *bar() {
4747
//CHECK: _Ptr<int> y = &sy;
4848
int *z = (sus(x, y));
4949
//CHECK_NOALL: _Ptr<int> z = (sus(x, y));
50-
//CHECK_ALL: _Ptr<int> z = (sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y));
50+
//CHECK_ALL: _Ptr<int> z = (sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y));
5151
return z;
5252
}

clang/test/3C/b_tests/b23_explicitunsafecast.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ int *foo() {
3030
//CHECK: _Ptr<int> y = &sy;
3131
int *z = (int *)sus(x, y);
3232
//CHECK_NOALL: _Ptr<int> z = (_Ptr<int>)sus(x, y);
33-
//CHECK_ALL: _Ptr<int> z = (_Ptr<int>)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y);
33+
//CHECK_ALL: _Ptr<int> z = (_Ptr<int>)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y);
3434
*z = *z + 1;
3535
return z;
3636
}
@@ -45,6 +45,6 @@ char *bar() {
4545
//CHECK: _Ptr<int> y = &sy;
4646
char *z = (char *)(sus(x, y));
4747
//CHECK_NOALL: char *z = (char *)(((int *)sus(x, y)));
48-
//CHECK_ALL: char *z = (char *)(((int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y)));
48+
//CHECK_ALL: char *z = (char *)(((int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y)));
4949
return z;
5050
}

clang/test/3C/b_tests/b23_retswitchexplicit.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ char *foo() {
3030
//CHECK: _Ptr<int> y = &sy;
3131
char *z = (int *)sus(x, y);
3232
//CHECK_NOALL: char *z = (int *)sus(x, y);
33-
//CHECK_ALL: char *z = (int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y);
33+
//CHECK_ALL: char *z = (int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y);
3434
*z = *z + 1;
3535
return z;
3636
}
@@ -45,6 +45,6 @@ int *bar() {
4545
//CHECK: _Ptr<int> y = &sy;
4646
int *z = (char *)(sus(x, y));
4747
//CHECK_NOALL: int *z = (char *)(sus(x, y));
48-
//CHECK_ALL: int *z = (char *)(sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y));
48+
//CHECK_ALL: int *z = (char *)(sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y));
4949
return z;
5050
}

clang/test/3C/b_tests/b24_implicitunsafecast.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ int *foo() {
3030
//CHECK: _Ptr<int> y = &sy;
3131
int *z = (int *)sus(x, y);
3232
//CHECK_NOALL: _Ptr<int> z = (_Ptr<int>)sus(x, y);
33-
//CHECK_ALL: _Ptr<int> z = (_Ptr<int>)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y);
33+
//CHECK_ALL: _Ptr<int> z = (_Ptr<int>)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y);
3434
*z = *z + 1;
3535
return z;
3636
}
@@ -45,6 +45,6 @@ char *bar() {
4545
//CHECK: _Ptr<int> y = &sy;
4646
char *z = sus(x, y);
4747
//CHECK_NOALL: char *z = ((int *)sus(x, y));
48-
//CHECK_ALL: char *z = ((int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y));
48+
//CHECK_ALL: char *z = ((int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y));
4949
return z;
5050
}

clang/test/3C/b_tests/b24_retswitchimplicit.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ char *foo() {
3030
//CHECK: _Ptr<int> y = &sy;
3131
char *z = (int *)sus(x, y);
3232
//CHECK_NOALL: char *z = (int *)sus(x, y);
33-
//CHECK_ALL: char *z = (int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y);
33+
//CHECK_ALL: char *z = (int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y);
3434
*z = *z + 1;
3535
return z;
3636
}
@@ -45,6 +45,6 @@ int *bar() {
4545
//CHECK: _Ptr<int> y = &sy;
4646
int *z = sus(x, y);
4747
//CHECK_NOALL: int *z = ((char *)sus(x, y));
48-
//CHECK_ALL: int *z = ((char *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y));
48+
//CHECK_ALL: int *z = ((char *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y));
4949
return z;
5050
}

clang/test/3C/b_tests/b25_castprotosafe.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ int *foo() {
2323
//CHECK: _Ptr<int> y = &sy;
2424
int *z = (int *)sus(x, y);
2525
//CHECK_NOALL: _Ptr<int> z = (_Ptr<int>)sus(x, y);
26-
//CHECK_ALL: _Ptr<int> z = (_Ptr<int>)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y);
26+
//CHECK_ALL: _Ptr<int> z = (_Ptr<int>)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y);
2727
*z = *z + 1;
2828
return z;
2929
}
@@ -38,7 +38,7 @@ int *bar() {
3838
//CHECK: _Ptr<int> y = &sy;
3939
int *z = (int *)(sus(x, y));
4040
//CHECK_NOALL: _Ptr<int> z = (_Ptr<int>)(sus(x, y));
41-
//CHECK_ALL: _Ptr<int> z = (_Ptr<int>)(sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y));
41+
//CHECK_ALL: _Ptr<int> z = (_Ptr<int>)(sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y));
4242
return z;
4343
}
4444

clang/test/3C/b_tests/b26_castprotounsafe.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ int *foo() {
2323
//CHECK: _Ptr<int> y = &sy;
2424
int *z = (int *)sus(x, y);
2525
//CHECK_NOALL: _Ptr<int> z = (_Ptr<int>)sus(x, y);
26-
//CHECK_ALL: _Ptr<int> z = (_Ptr<int>)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y);
26+
//CHECK_ALL: _Ptr<int> z = (_Ptr<int>)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y);
2727
*z = *z + 1;
2828
return z;
2929
}
@@ -38,7 +38,7 @@ char *bar() {
3838
//CHECK: _Ptr<int> y = &sy;
3939
char *z = (char *)(sus(x, y));
4040
//CHECK_NOALL: char *z = (char *)(((int *)sus(x, y)));
41-
//CHECK_ALL: char *z = (char *)(((int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y)));
41+
//CHECK_ALL: char *z = (char *)(((int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y)));
4242
return z;
4343
}
4444

clang/test/3C/b_tests/b26_castprotounsafeimplicit.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ int *foo() {
2323
//CHECK: _Ptr<int> y = &sy;
2424
int *z = (int *)sus(x, y);
2525
//CHECK_NOALL: _Ptr<int> z = (_Ptr<int>)sus(x, y);
26-
//CHECK_ALL: _Ptr<int> z = (_Ptr<int>)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y);
26+
//CHECK_ALL: _Ptr<int> z = (_Ptr<int>)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y);
2727
*z = *z + 1;
2828
return z;
2929
}
@@ -38,7 +38,7 @@ char *bar() {
3838
//CHECK: _Ptr<int> y = &sy;
3939
char *z = (sus(x, y));
4040
//CHECK_NOALL: char *z = (((int *)sus(x, y)));
41-
//CHECK_ALL: char *z = (((int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y)));
41+
//CHECK_ALL: char *z = (((int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y)));
4242
return z;
4343
}
4444

clang/test/3C/b_tests/b26_castprotounsafeimplicitretswitch.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ char *foo() {
2323
//CHECK: _Ptr<int> y = &sy;
2424
char *z = (int *)sus(x, y);
2525
//CHECK_NOALL: char *z = (int *)sus(x, y);
26-
//CHECK_ALL: char *z = (int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y);
26+
//CHECK_ALL: char *z = (int *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y);
2727
*z = *z + 1;
2828
return z;
2929
}
@@ -38,7 +38,7 @@ int *bar() {
3838
//CHECK: _Ptr<int> y = &sy;
3939
int *z = (sus(x, y));
4040
//CHECK_NOALL: int *z = (((char *)sus(x, y)));
41-
//CHECK_ALL: int *z = (((char *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, byte_count(0)), y)));
41+
//CHECK_ALL: int *z = (((char *)sus(_Assume_bounds_cast<_Array_ptr<int>>(x, bounds(unknown)), y)));
4242
return z;
4343
}
4444

0 commit comments

Comments
 (0)