diff --git a/facebook-clang-plugins b/facebook-clang-plugins index 6075a1105..63db8d4a8 160000 --- a/facebook-clang-plugins +++ b/facebook-clang-plugins @@ -1 +1 @@ -Subproject commit 6075a1105f38d8d77aaf0be82eda7336a8304cd1 +Subproject commit 63db8d4a883c5ae356c23eec85e520a0d2c9660d diff --git a/infer/tests/codetoanalyze/cpp/errors/Makefile b/infer/tests/codetoanalyze/cpp/errors/Makefile index 672e2d6a4..df22cd7d1 100644 --- a/infer/tests/codetoanalyze/cpp/errors/Makefile +++ b/infer/tests/codetoanalyze/cpp/errors/Makefile @@ -49,6 +49,7 @@ SOURCES = \ shared/reference/reference_type_e2e.cpp \ shared/reference/temporary_lvalue.cpp \ shared/templates/class_template_instantiate.cpp \ + shared/templates/class_specialization.cpp \ shared/templates/function.cpp \ shared/templates/function_pack.cpp \ shared/templates/method.cpp \ diff --git a/infer/tests/codetoanalyze/cpp/errors/issues.exp b/infer/tests/codetoanalyze/cpp/errors/issues.exp index 6e5ea00f5..f20452570 100644 --- a/infer/tests/codetoanalyze/cpp/errors/issues.exp +++ b/infer/tests/codetoanalyze/cpp/errors/issues.exp @@ -331,6 +331,8 @@ codetoanalyze/cpp/shared/reference/reference_type_e2e.cpp, ref_div0_nested_assig codetoanalyze/cpp/shared/reference/temporary_lvalue.cpp, div0_function_param_cast, 0, DIVIDE_BY_ZERO, [start of procedure div0_function_param_cast(),start of procedure div()] codetoanalyze/cpp/shared/reference/temporary_lvalue.cpp, div0_init_expr, 2, DIVIDE_BY_ZERO, [start of procedure div0_init_expr(),start of procedure div()] codetoanalyze/cpp/shared/reference/temporary_lvalue.cpp, div0_no_const_ref, 2, DIVIDE_BY_ZERO, [start of procedure div0_no_const_ref(),start of procedure div()] +codetoanalyze/cpp/shared/templates/class_specialization.cpp, class_specialization::foo_int, 3, DIVIDE_BY_ZERO, [start of procedure class_specialization::foo_int(),start of procedure Derived,start of procedure Base,return from a call to class_specialization::Base_Base,return from a call to class_specialization::Derived_Derived,start of procedure foo,return from a call to class_specialization::Derived_foo] +codetoanalyze/cpp/shared/templates/class_specialization.cpp, class_specialization::foo_intptr, 3, NULL_DEREFERENCE, [start of procedure class_specialization::foo_intptr(),start of procedure Derived,start of procedure Base,return from a call to class_specialization::Base_Base,return from a call to class_specialization::Derived_Derived,start of procedure foo2,return from a call to class_specialization::Derived_foo2] codetoanalyze/cpp/shared/templates/class_template_instantiate.cpp, ExecStore_call_div, 2, DIVIDE_BY_ZERO, [start of procedure call_div,start of procedure div] codetoanalyze/cpp/shared/templates/class_template_instantiate.cpp, choose1_div0, 0, DIVIDE_BY_ZERO, [start of procedure choose1_div0(),start of procedure call_div,start of procedure div] codetoanalyze/cpp/shared/templates/class_template_instantiate.cpp, choose2_div0_extra, 0, DIVIDE_BY_ZERO, [start of procedure choose2_div0_extra(),start of procedure extra] diff --git a/infer/tests/codetoanalyze/cpp/shared/templates/class_specialization.cpp b/infer/tests/codetoanalyze/cpp/shared/templates/class_specialization.cpp new file mode 100644 index 000000000..58c394b0d --- /dev/null +++ b/infer/tests/codetoanalyze/cpp/shared/templates/class_specialization.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2017 - present Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +namespace class_specialization { + +template +struct Base { + T x; +}; + +template +struct Derived : public Base { + void foo(T t) { this->x = t; } +}; + +template +struct Derived : public Base { + void foo2(T* t) { this->x = t; } +}; + +void foo_intptr() { + Derived b; + b.foo2(nullptr); + int x = *b.x; +} + +void foo_int() { + Derived b; + b.foo(0); + int z = 1 / b.x; +} + +} // namespace class_specialization diff --git a/infer/tests/codetoanalyze/cpp/shared/templates/class_specialization.cpp.dot b/infer/tests/codetoanalyze/cpp/shared/templates/class_specialization.cpp.dot new file mode 100644 index 000000000..b5c5ad689 --- /dev/null +++ b/infer/tests/codetoanalyze/cpp/shared/templates/class_specialization.cpp.dot @@ -0,0 +1,99 @@ +/* @generated */ +digraph iCFG { +"foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_1" [label="1: Start class_specialization::foo_intptr\nFormals: \nLocals: x:int b:class_specialization::Derived \n DECLARE_LOCALS(&return,&x,&b); [line 26]\n " color=yellow style=filled] + + + "foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_1" -> "foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_5" ; +"foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_2" [label="2: Exit class_specialization::foo_intptr \n " color=yellow style=filled] + + +"foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_3" [label="3: DeclStmt \n n$0=*&b.x:int* [line 29]\n n$1=*n$0:int [line 29]\n *&x:int=n$1 [line 29]\n " shape="box"] + + + "foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_3" -> "foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_2" ; +"foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_4" [label="4: Call _fun_class_specialization::Derived_foo2 \n _=*&b:class_specialization::Derived [line 28]\n _fun_class_specialization::Derived_foo2(&b:class_specialization::Derived&,null:int*) [line 28]\n " shape="box"] + + + "foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_4" -> "foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_3" ; +"foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_5" [label="5: DeclStmt \n _fun_class_specialization::Derived_Derived(&b:class_specialization::Derived*) [line 27]\n " shape="box"] + + + "foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_5" -> "foo_intptr#class_specialization#_ZN20class_specialization10foo_intptrEv.c19d80b3d535dbc9c6d850dd8f10e3a6_4" ; +"foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_1" [label="1: Start class_specialization::foo_int\nFormals: \nLocals: z:int b:class_specialization::Derived \n DECLARE_LOCALS(&return,&z,&b); [line 32]\n " color=yellow style=filled] + + + "foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_1" -> "foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_5" ; +"foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_2" [label="2: Exit class_specialization::foo_int \n " color=yellow style=filled] + + +"foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_3" [label="3: DeclStmt \n n$0=*&b.x:int [line 35]\n *&z:int=(1 / n$0) [line 35]\n " shape="box"] + + + "foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_3" -> "foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_2" ; +"foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_4" [label="4: Call _fun_class_specialization::Derived_foo \n _=*&b:class_specialization::Derived [line 34]\n _fun_class_specialization::Derived_foo(&b:class_specialization::Derived&,0:int) [line 34]\n " shape="box"] + + + "foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_4" -> "foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_3" ; +"foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_5" [label="5: DeclStmt \n _fun_class_specialization::Derived_Derived(&b:class_specialization::Derived*) [line 33]\n " shape="box"] + + + "foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_5" -> "foo_int#class_specialization#_ZN20class_specialization7foo_intEv.6f63111c0806782f53c8007624316a0c_4" ; +"Base#Base#class_specialization#{_ZN20class_specialization4BaseIiEC1Ev}.9f658966397464c569b5cdf0a55d2da4_1" [label="1: Start class_specialization::Base_Base\nFormals: this:class_specialization::Base*\nLocals: \n DECLARE_LOCALS(&return); [line 12]\n " color=yellow style=filled] + + + "Base#Base#class_specialization#{_ZN20class_specialization4BaseIiEC1Ev}.9f658966397464c569b5cdf0a55d2da4_1" -> "Base#Base#class_specialization#{_ZN20class_specialization4BaseIiEC1Ev}.9f658966397464c569b5cdf0a55d2da4_2" ; +"Base#Base#class_specialization#{_ZN20class_specialization4BaseIiEC1Ev}.9f658966397464c569b5cdf0a55d2da4_2" [label="2: Exit class_specialization::Base_Base \n " color=yellow style=filled] + + +"Base#Base#class_specialization#{_ZN20class_specialization4BaseIPiEC1Ev}.dea792851a5bef48197214d7ac20d162_1" [label="1: Start class_specialization::Base_Base\nFormals: this:class_specialization::Base*\nLocals: \n DECLARE_LOCALS(&return); [line 12]\n " color=yellow style=filled] + + + "Base#Base#class_specialization#{_ZN20class_specialization4BaseIPiEC1Ev}.dea792851a5bef48197214d7ac20d162_1" -> "Base#Base#class_specialization#{_ZN20class_specialization4BaseIPiEC1Ev}.dea792851a5bef48197214d7ac20d162_2" ; +"Base#Base#class_specialization#{_ZN20class_specialization4BaseIPiEC1Ev}.dea792851a5bef48197214d7ac20d162_2" [label="2: Exit class_specialization::Base_Base \n " color=yellow style=filled] + + +"Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIiEC1Ev}.e116e1143fd21e664658f83e6ae62af4_1" [label="1: Start class_specialization::Derived_Derived\nFormals: this:class_specialization::Derived*\nLocals: \n DECLARE_LOCALS(&return); [line 17]\n " color=yellow style=filled] + + + "Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIiEC1Ev}.e116e1143fd21e664658f83e6ae62af4_1" -> "Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIiEC1Ev}.e116e1143fd21e664658f83e6ae62af4_3" ; +"Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIiEC1Ev}.e116e1143fd21e664658f83e6ae62af4_2" [label="2: Exit class_specialization::Derived_Derived \n " color=yellow style=filled] + + +"Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIiEC1Ev}.e116e1143fd21e664658f83e6ae62af4_3" [label="3: Constructor Init \n n$0=*&this:class_specialization::Derived* [line 17]\n _fun_class_specialization::Base_Base(n$0:class_specialization::Derived*) [line 17]\n " shape="box"] + + + "Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIiEC1Ev}.e116e1143fd21e664658f83e6ae62af4_3" -> "Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIiEC1Ev}.e116e1143fd21e664658f83e6ae62af4_2" ; +"foo#Derived#class_specialization#(_ZN20class_specialization7DerivedIiE3fooEi).0c794b38a798abffd37d8daf11cfbbef_1" [label="1: Start class_specialization::Derived_foo\nFormals: this:class_specialization::Derived* t:int\nLocals: \n DECLARE_LOCALS(&return); [line 18]\n " color=yellow style=filled] + + + "foo#Derived#class_specialization#(_ZN20class_specialization7DerivedIiE3fooEi).0c794b38a798abffd37d8daf11cfbbef_1" -> "foo#Derived#class_specialization#(_ZN20class_specialization7DerivedIiE3fooEi).0c794b38a798abffd37d8daf11cfbbef_3" ; +"foo#Derived#class_specialization#(_ZN20class_specialization7DerivedIiE3fooEi).0c794b38a798abffd37d8daf11cfbbef_2" [label="2: Exit class_specialization::Derived_foo \n " color=yellow style=filled] + + +"foo#Derived#class_specialization#(_ZN20class_specialization7DerivedIiE3fooEi).0c794b38a798abffd37d8daf11cfbbef_3" [label="3: BinaryOperatorStmt: Assign \n n$0=*&this:class_specialization::Derived* [line 18]\n n$1=*&t:int [line 18]\n *n$0.x:int=n$1 [line 18]\n " shape="box"] + + + "foo#Derived#class_specialization#(_ZN20class_specialization7DerivedIiE3fooEi).0c794b38a798abffd37d8daf11cfbbef_3" -> "foo#Derived#class_specialization#(_ZN20class_specialization7DerivedIiE3fooEi).0c794b38a798abffd37d8daf11cfbbef_2" ; +"Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIPiEC1Ev}.1a3cc564bd2adc598344fe93c409db80_1" [label="1: Start class_specialization::Derived_Derived\nFormals: this:class_specialization::Derived*\nLocals: \n DECLARE_LOCALS(&return); [line 22]\n " color=yellow style=filled] + + + "Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIPiEC1Ev}.1a3cc564bd2adc598344fe93c409db80_1" -> "Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIPiEC1Ev}.1a3cc564bd2adc598344fe93c409db80_3" ; +"Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIPiEC1Ev}.1a3cc564bd2adc598344fe93c409db80_2" [label="2: Exit class_specialization::Derived_Derived \n " color=yellow style=filled] + + +"Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIPiEC1Ev}.1a3cc564bd2adc598344fe93c409db80_3" [label="3: Constructor Init \n n$0=*&this:class_specialization::Derived* [line 22]\n _fun_class_specialization::Base_Base(n$0:class_specialization::Derived*) [line 22]\n " shape="box"] + + + "Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIPiEC1Ev}.1a3cc564bd2adc598344fe93c409db80_3" -> "Derived#Derived#class_specialization#{_ZN20class_specialization7DerivedIPiEC1Ev}.1a3cc564bd2adc598344fe93c409db80_2" ; +"foo2#Derived#class_specialization#(_ZN20class_specialization7DerivedIPiE4foo2ES1_).ad7ae4c6761ba05b845d0f55f64e64f6_1" [label="1: Start class_specialization::Derived_foo2\nFormals: this:class_specialization::Derived* t:int*\nLocals: \n DECLARE_LOCALS(&return); [line 23]\n " color=yellow style=filled] + + + "foo2#Derived#class_specialization#(_ZN20class_specialization7DerivedIPiE4foo2ES1_).ad7ae4c6761ba05b845d0f55f64e64f6_1" -> "foo2#Derived#class_specialization#(_ZN20class_specialization7DerivedIPiE4foo2ES1_).ad7ae4c6761ba05b845d0f55f64e64f6_3" ; +"foo2#Derived#class_specialization#(_ZN20class_specialization7DerivedIPiE4foo2ES1_).ad7ae4c6761ba05b845d0f55f64e64f6_2" [label="2: Exit class_specialization::Derived_foo2 \n " color=yellow style=filled] + + +"foo2#Derived#class_specialization#(_ZN20class_specialization7DerivedIPiE4foo2ES1_).ad7ae4c6761ba05b845d0f55f64e64f6_3" [label="3: BinaryOperatorStmt: Assign \n n$0=*&this:class_specialization::Derived* [line 23]\n n$1=*&t:int* [line 23]\n *n$0.x:int*=n$1 [line 23]\n " shape="box"] + + + "foo2#Derived#class_specialization#(_ZN20class_specialization7DerivedIPiE4foo2ES1_).ad7ae4c6761ba05b845d0f55f64e64f6_3" -> "foo2#Derived#class_specialization#(_ZN20class_specialization7DerivedIPiE4foo2ES1_).ad7ae4c6761ba05b845d0f55f64e64f6_2" ; +}