aboutsummaryrefslogtreecommitdiffstats
path: root/cparser/Cflow.ml
diff options
context:
space:
mode:
authorBernhard Schommer <bernhardschommer@gmail.com>2017-02-16 16:45:05 +0100
committerBernhard Schommer <bernhardschommer@gmail.com>2017-02-16 16:45:05 +0100
commit20c7b4d292ca1e69b66d10e8b0054982fe464714 (patch)
tree073ff5557711a4b1141445281e56a67764c11c63 /cparser/Cflow.ml
parent9b63d90b40974eed35bd199fcfc6ccbabb1ed5b7 (diff)
downloadcompcert-kvx-20c7b4d292ca1e69b66d10e8b0054982fe464714.tar.gz
compcert-kvx-20c7b4d292ca1e69b66d10e8b0054982fe464714.zip
Added handling for noreturn std functions.
The C11 standard declares exit,abort,_Exit,quick_exit and thrd_exit as _Noreturn however this is not included in older C libs and leads to false negatives in reporting _Noreturn and return type warnings. This can be avoided by enhancing the noreturn check of the Cflow analysis to also test if one of the above functions is called. Bug 21009
Diffstat (limited to 'cparser/Cflow.ml')
-rw-r--r--cparser/Cflow.ml11
1 files changed, 8 insertions, 3 deletions
diff --git a/cparser/Cflow.ml b/cparser/Cflow.ml
index 790d9079..718ae421 100644
--- a/cparser/Cflow.ml
+++ b/cparser/Cflow.ml
@@ -22,6 +22,10 @@ open Cutil
module StringSet = Set.Make(String)
+(* Functions declared noreturn by the standard *)
+let std_noreturn_functions =
+ ["exit";"abort";"_Exit";"quick_exit";"thrd_exit"]
+
(* Statements are abstracted as "flow transformers":
functions from possible inputs to possible outcomes.
Possible inputs are:
@@ -177,9 +181,10 @@ let rec outcomes env s : flow =
| Sskip ->
normal
| Sdo {edesc = ECall(fn, args)} ->
- if find_custom_attributes ["noreturn"; "__noreturn__"]
- (attributes_of_type env fn.etyp) = []
- then normal else noflow
+ let returns = find_custom_attributes ["noreturn"; "__noreturn__"]
+ (attributes_of_type env fn.etyp) = [] in
+ let std_noreturn = List.exists (is_call_to_fun fn) std_noreturn_functions in
+ if returns && not std_noreturn then normal else noflow
| Sdo e ->
normal
| Sseq(s1, s2) ->