[cfe-commits] r69499 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDecl.cpp test/Sema/scope-check.c
Chris Lattner
sabre at nondot.org
Sat Apr 18 18:16:06 PDT 2009
Author: lattner
Date: Sat Apr 18 20:16:06 2009
New Revision: 69499
URL: http://llvm.org/viewvc/llvm-project?rev=69499&view=rev
Log:
second half of indirect jump checking: make sure that any
address taken labels are in function scope
Modified:
cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/test/Sema/scope-check.c
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=69499&r1=69498&r2=69499&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sat Apr 18 20:16:06 2009
@@ -836,6 +836,9 @@
"illegal switch case into protected scope">;
def err_indirect_goto_in_protected_scope : Error<
"illegal indirect goto in protected scope, unknown effect on scopes">;
+def err_addr_of_label_in_protected_scope : Error<
+ "address taken of label in protected scope, jump to it would have "
+ "unknown effect on scope">;
def note_protected_by_vla_typedef : Note<
"jump bypasses initialization of VLA typedef">;
def note_protected_by_vla : Note<
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=69499&r1=69498&r2=69499&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Sat Apr 18 20:16:06 2009
@@ -2988,7 +2988,7 @@
if (isa<LabelStmt>(S) || isa<DefaultStmt>(S) || isa<CaseStmt>(S)) {
LabelAndGotoScopes[S] = ParentScope;
} else if (isa<GotoStmt>(S) || isa<SwitchStmt>(S) ||
- isa<IndirectGotoStmt>(S)) {
+ isa<IndirectGotoStmt>(S) || isa<AddrLabelExpr>(S)) {
// Remember both what scope a goto is in as well as the fact that we have
// it. This makes the second scan not have to walk the AST again.
LabelAndGotoScopes[S] = ParentScope;
@@ -3082,19 +3082,41 @@
}
+ unsigned DiagnosticScope;
+
// We don't know where an indirect goto goes, require that it be at the
// top level of scoping.
- assert(isa<IndirectGotoStmt>(Jump));
- assert(LabelAndGotoScopes.count(Jump) &&"Jump didn't get added to scopes?");
- unsigned GotoScope = LabelAndGotoScopes[Jump];
- if (GotoScope == 0) continue;
- S.Diag(Jump->getLocStart(), diag::err_indirect_goto_in_protected_scope);
-
- while (GotoScope != 0) {
- S.Diag(Scopes[GotoScope].Loc, Scopes[GotoScope].Diag);
- GotoScope = Scopes[GotoScope].ParentScope;
+ if (IndirectGotoStmt *IG = dyn_cast<IndirectGotoStmt>(Jump)) {
+ assert(LabelAndGotoScopes.count(Jump) &&
+ "Jump didn't get added to scopes?");
+ unsigned GotoScope = LabelAndGotoScopes[IG];
+ if (GotoScope == 0) continue; // indirect jump is ok.
+ S.Diag(IG->getGotoLoc(), diag::err_indirect_goto_in_protected_scope);
+ DiagnosticScope = GotoScope;
+ } else {
+ // We model &&Label as a jump for purposes of scope tracking. We actually
+ // don't care *where* the address of label is, but we require the *label
+ // itself* to be in scope 0. If it is nested inside of a VLA scope, then
+ // it is possible for an indirect goto to illegally enter the VLA scope by
+ // indirectly jumping to the label.
+ assert(isa<AddrLabelExpr>(Jump) && "Unknown jump type");
+ LabelStmt *TheLabel = cast<AddrLabelExpr>(Jump)->getLabel();
+
+ assert(LabelAndGotoScopes.count(TheLabel) &&
+ "Referenced label didn't get added to scopes?");
+ unsigned LabelScope = LabelAndGotoScopes[TheLabel];
+ if (LabelScope == 0) continue; // Addr of label is ok.
+
+ S.Diag(Jump->getLocStart(), diag::err_addr_of_label_in_protected_scope);
+ DiagnosticScope = LabelScope;
+ }
+
+ // Report all the things that would be skipped over by this &&label or
+ // indirect goto.
+ while (DiagnosticScope != 0) {
+ S.Diag(Scopes[DiagnosticScope].Loc, Scopes[DiagnosticScope].Diag);
+ DiagnosticScope = Scopes[DiagnosticScope].ParentScope;
}
- continue;
}
}
Modified: cfe/trunk/test/Sema/scope-check.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/scope-check.c?rev=69499&r1=69498&r2=69499&view=diff
==============================================================================
--- cfe/trunk/test/Sema/scope-check.c (original)
+++ cfe/trunk/test/Sema/scope-check.c Sat Apr 18 20:16:06 2009
@@ -136,14 +136,17 @@
goto *P; // ok.
L2: ;
- int a[n]; // expected-note {{jump bypasses initialization of variable length array}}
+ int a[n]; // expected-note 2 {{jump bypasses initialization of variable length array}}
L3:
+L4:
goto *P; // expected-error {{illegal indirect goto in protected scope, unknown effect on scopes}}
+ goto L3; // ok
+ goto L4; // ok
void *Ptrs[] = {
- &&L2,
- &&L3 // FIXME: Not Ok.
+ &&L2, // Ok.
+ &&L3 // expected-error {{address taken of label in protected scope, jump to it would have unknown effect on scope}}
};
}
More information about the cfe-commits
mailing list