adlint 3.0.0 → 3.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +41 -0
- data/INSTALL +1 -1
- data/NEWS +14 -4
- data/etc/mesg.d/c_builtin/en_US/messages.yml +2 -2
- data/etc/mesg.d/c_builtin/ja_JP/messages.yml +2 -2
- data/etc/mesg.d/core/en_US/messages.yml +1 -1
- data/etc/mesg.d/core/ja_JP/messages.yml +1 -1
- data/lib/adlint/cc1/expr.rb +39 -100
- data/lib/adlint/cc1/interp.rb +11 -3
- data/lib/adlint/memo.rb +98 -97
- data/lib/adlint/version.rb +2 -2
- data/share/doc/developers_guide_ja.html +3 -3
- data/share/doc/developers_guide_ja.texi +1 -1
- data/share/doc/users_guide_en.html +5 -5
- data/share/doc/users_guide_en.texi +3 -3
- data/share/doc/users_guide_ja.html +5 -5
- data/share/doc/users_guide_ja.texi +3 -3
- data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_traits.yml +1 -1
- metadata +2 -2
data/ChangeLog
CHANGED
@@ -1,3 +1,44 @@
|
|
1
|
+
Thu Apr 12 10:48:11 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
|
2
|
+
|
3
|
+
* release.ga : 3.0.2
|
4
|
+
- Add missing transparency between a pointer to array and an array
|
5
|
+
variable in expression evaluation.
|
6
|
+
- Add missing transparency between a pointer function and a function
|
7
|
+
in expression evaluation.
|
8
|
+
- Clarify W0100 message text.
|
9
|
+
- Refactor memoizing utility in preparation for performance tuning.
|
10
|
+
|
11
|
+
Wed Apr 10 17:18:42 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
|
12
|
+
|
13
|
+
* lib/adlint/memo.rb : Refactor memoizing utility in preparation for
|
14
|
+
performance improvement.
|
15
|
+
|
16
|
+
Tue Apr 2 17:22:02 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
|
17
|
+
|
18
|
+
* release.rc : 3.0.1
|
19
|
+
- Add missing transparency between a pointer to array and an array
|
20
|
+
variable in expression evaluation.
|
21
|
+
- Add missing transparency between a pointer function and a function
|
22
|
+
in expression evaluation.
|
23
|
+
- Clarify W0100 message text.
|
24
|
+
|
25
|
+
Tue Apr 2 16:50:12 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
|
26
|
+
|
27
|
+
* etc/mesg.d/c_builtin/ja_JP/messages.yml : Clarify W0100 message text.
|
28
|
+
* etc/mesg.d/c_builtin/en_US/messages.yml : Ditto.
|
29
|
+
|
30
|
+
Mon Apr 1 15:55:03 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
|
31
|
+
|
32
|
+
* lib/adlint/cc1/expr.rb : Add missing transparency between a pointer
|
33
|
+
function and a function in expression evaluation.
|
34
|
+
* lib/adlint/cc1/interp.rb : Ditto.
|
35
|
+
|
36
|
+
Thu Apr 1 10:08:45 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
|
37
|
+
|
38
|
+
* lib/adlint/cc1/expr.rb : Add missing transparency between a pointer
|
39
|
+
to array and an array variable in expression evaluation.
|
40
|
+
* lib/adlint/cc1/interp.rb : Ditto.
|
41
|
+
|
1
42
|
Tue Mar 26 17:01:16 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
|
2
43
|
|
3
44
|
* release.ga : 3.0.0
|
data/INSTALL
CHANGED
data/NEWS
CHANGED
@@ -21,6 +21,20 @@
|
|
21
21
|
|
22
22
|
++
|
23
23
|
|
24
|
+
=== \AdLint 3.0.2 is released (2013-04-12)
|
25
|
+
|
26
|
+
==== Changes since the 3.0.0 release
|
27
|
+
|
28
|
+
* Add missing transparency between a pointer to array and an array variable in
|
29
|
+
expression evaluation
|
30
|
+
* Add missing transparency between a pointer function and a function in
|
31
|
+
expression evaluation
|
32
|
+
* Clarify W0100 message text
|
33
|
+
|
34
|
+
See the file
|
35
|
+
{ChangeLog}[http://adlint.sourceforge.net/pmwiki/upload.d/Main/ChangeLog]
|
36
|
+
for more details.
|
37
|
+
|
24
38
|
=== \AdLint 3.0.0 is released (2013-03-27)
|
25
39
|
|
26
40
|
==== Changes since the 2.6.14 release
|
@@ -50,10 +64,6 @@
|
|
50
64
|
the terminating execution path
|
51
65
|
* Support Ruby 2.0.0-p0
|
52
66
|
|
53
|
-
See the file
|
54
|
-
{ChangeLog}[http://adlint.sourceforge.net/pmwiki/upload.d/Main/ChangeLog]
|
55
|
-
for more details.
|
56
|
-
|
57
67
|
=== \AdLint 2.6.14 is released (2012-12-17)
|
58
68
|
|
59
69
|
==== Changes since the 2.6.12 release
|
@@ -49,7 +49,7 @@
|
|
49
49
|
# - "ERR:X99"
|
50
50
|
# format: "Your custom message for the error of E9999."
|
51
51
|
|
52
|
-
version: "3.0.
|
52
|
+
version: "3.0.2"
|
53
53
|
|
54
54
|
message_definition:
|
55
55
|
W0001:
|
@@ -335,7 +335,7 @@ message_definition:
|
|
335
335
|
W0100:
|
336
336
|
classes:
|
337
337
|
- "UNC:X99"
|
338
|
-
format: "The
|
338
|
+
format: "The variable `%s' has not been reassigned since the initial value is assigned. It may be able to be defined as `const' with an initial value."
|
339
339
|
W0101:
|
340
340
|
classes:
|
341
341
|
- "UNC:X99"
|
@@ -49,7 +49,7 @@
|
|
49
49
|
# - "ERR:X99"
|
50
50
|
# format: "Your custom message for the error of E9999."
|
51
51
|
|
52
|
-
version: "3.0.
|
52
|
+
version: "3.0.2"
|
53
53
|
|
54
54
|
message_definition:
|
55
55
|
W0001:
|
@@ -335,7 +335,7 @@ message_definition:
|
|
335
335
|
W0100:
|
336
336
|
classes:
|
337
337
|
- "UNC:X99"
|
338
|
-
format: "変数 `%s'
|
338
|
+
format: "変数 `%s' は初期値を設定後に再代入されません。変数を const 付きで初期値を指定して定義できる可能性があります。"
|
339
339
|
W0101:
|
340
340
|
classes:
|
341
341
|
- "UNC:X99"
|
data/lib/adlint/cc1/expr.rb
CHANGED
@@ -461,7 +461,7 @@ module Cc1 #:nodoc:
|
|
461
461
|
end
|
462
462
|
|
463
463
|
def eval_array_subscript_expr(node, obj, subs)
|
464
|
-
unless obj.variable?
|
464
|
+
unless obj.variable? and obj.type.array? || obj.type.pointer?
|
465
465
|
return create_tmpvar
|
466
466
|
end
|
467
467
|
|
@@ -627,9 +627,9 @@ module Cc1 #:nodoc:
|
|
627
627
|
end
|
628
628
|
|
629
629
|
def eval_postfix_increment_expr(node, obj)
|
630
|
-
|
631
|
-
|
632
|
-
|
630
|
+
var = object_to_variable(obj)
|
631
|
+
if !var.type.scalar? && !var.type.void?
|
632
|
+
# NOTE: To detect bad value reference of `void' expressions.
|
633
633
|
return create_tmpvar
|
634
634
|
end
|
635
635
|
|
@@ -650,9 +650,9 @@ module Cc1 #:nodoc:
|
|
650
650
|
end
|
651
651
|
|
652
652
|
def eval_postfix_decrement_expr(node, obj)
|
653
|
-
|
654
|
-
|
655
|
-
|
653
|
+
var = object_to_variable(obj)
|
654
|
+
if !var.type.scalar? && !var.type.void?
|
655
|
+
# NOTE: To detect bad value reference of `void' expressions.
|
656
656
|
return create_tmpvar
|
657
657
|
end
|
658
658
|
|
@@ -673,9 +673,9 @@ module Cc1 #:nodoc:
|
|
673
673
|
end
|
674
674
|
|
675
675
|
def eval_prefix_increment_expr(node, obj)
|
676
|
-
|
677
|
-
|
678
|
-
|
676
|
+
var = object_to_variable(obj)
|
677
|
+
if !var.type.scalar? && !var.type.void?
|
678
|
+
# NOTE: To detect bad value reference of `void' expressions.
|
679
679
|
return create_tmpvar
|
680
680
|
end
|
681
681
|
|
@@ -696,9 +696,9 @@ module Cc1 #:nodoc:
|
|
696
696
|
end
|
697
697
|
|
698
698
|
def eval_prefix_decrement_expr(node, obj)
|
699
|
-
|
700
|
-
|
701
|
-
|
699
|
+
var = object_to_variable(obj)
|
700
|
+
if !var.type.scalar? && !var.type.void?
|
701
|
+
# NOTE: To detect bad value reference of `void' expressions.
|
702
702
|
return create_tmpvar
|
703
703
|
end
|
704
704
|
|
@@ -730,8 +730,9 @@ module Cc1 #:nodoc:
|
|
730
730
|
end
|
731
731
|
|
732
732
|
def eval_indirection_expr(node, obj)
|
733
|
-
|
734
|
-
|
733
|
+
var = object_to_variable(obj)
|
734
|
+
if var.type.pointer?
|
735
|
+
ptr = var
|
735
736
|
else
|
736
737
|
return create_tmpvar
|
737
738
|
end
|
@@ -768,12 +769,9 @@ module Cc1 #:nodoc:
|
|
768
769
|
|
769
770
|
def eval_unary_arithmetic_expr(node, obj)
|
770
771
|
var = object_to_variable(obj)
|
771
|
-
|
772
|
-
when !var.type.scalar? && !var.type.void?
|
772
|
+
if !var.type.scalar? && !var.type.void?
|
773
773
|
# NOTE: To detect bad value reference of `void' expressions.
|
774
774
|
return create_tmpvar
|
775
|
-
when var != obj
|
776
|
-
notify_implicit_conv_performed(node.operand, obj, var)
|
777
775
|
end
|
778
776
|
|
779
777
|
case node.operator.type
|
@@ -813,21 +811,15 @@ module Cc1 #:nodoc:
|
|
813
811
|
|
814
812
|
def eval_multiplicative_expr(node, lhs_obj, rhs_obj)
|
815
813
|
lhs_var = object_to_variable(lhs_obj)
|
816
|
-
|
817
|
-
when !lhs_var.type.scalar? && !lhs_var.type.void?
|
814
|
+
if !lhs_var.type.scalar? && !lhs_var.type.void?
|
818
815
|
# NOTE: To detect bad value reference of `void' expressions.
|
819
816
|
return create_tmpvar
|
820
|
-
when lhs_var != lhs_obj
|
821
|
-
notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
|
822
817
|
end
|
823
818
|
|
824
819
|
rhs_var = object_to_variable(rhs_obj)
|
825
|
-
|
826
|
-
when !rhs_var.type.scalar? && !rhs_var.type.void?
|
820
|
+
if !rhs_var.type.scalar? && !rhs_var.type.void?
|
827
821
|
# NOTE: To detect bad value reference of `void' expressions.
|
828
822
|
return create_tmpvar
|
829
|
-
when rhs_var != rhs_obj
|
830
|
-
notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
|
831
823
|
end
|
832
824
|
|
833
825
|
lhs_conved, rhs_conved =
|
@@ -872,21 +864,15 @@ module Cc1 #:nodoc:
|
|
872
864
|
|
873
865
|
def eval_additive_expr(node, lhs_obj, rhs_obj)
|
874
866
|
lhs_var = object_to_variable(lhs_obj)
|
875
|
-
|
876
|
-
when !lhs_var.type.scalar? && !lhs_var.type.void?
|
867
|
+
if !lhs_var.type.scalar? && !lhs_var.type.void?
|
877
868
|
# NOTE: To detect bad value reference of `void' expressions.
|
878
869
|
return create_tmpvar
|
879
|
-
when lhs_var != lhs_obj
|
880
|
-
notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
|
881
870
|
end
|
882
871
|
|
883
872
|
rhs_var = object_to_variable(rhs_obj)
|
884
|
-
|
885
|
-
when !rhs_var.type.scalar? && !rhs_var.type.void?
|
873
|
+
if !rhs_var.type.scalar? && !rhs_var.type.void?
|
886
874
|
# NOTE: To detect bad value reference of `void' expressions.
|
887
875
|
return create_tmpvar
|
888
|
-
when rhs_var != rhs_obj
|
889
|
-
notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
|
890
876
|
end
|
891
877
|
|
892
878
|
lhs_conved, rhs_conved =
|
@@ -923,21 +909,15 @@ module Cc1 #:nodoc:
|
|
923
909
|
|
924
910
|
def eval_shift_expr(node, lhs_obj, rhs_obj)
|
925
911
|
lhs_var = object_to_variable(lhs_obj)
|
926
|
-
|
927
|
-
when !lhs_var.type.scalar? && !lhs_var.type.void?
|
912
|
+
if !lhs_var.type.scalar? && !lhs_var.type.void?
|
928
913
|
# NOTE: To detect bad value reference of `void' expressions.
|
929
914
|
return create_tmpvar
|
930
|
-
when lhs_var != lhs_obj
|
931
|
-
notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
|
932
915
|
end
|
933
916
|
|
934
917
|
rhs_var = object_to_variable(rhs_obj)
|
935
|
-
|
936
|
-
when !rhs_var.type.scalar? && !rhs_var.type.void?
|
918
|
+
if !rhs_var.type.scalar? && !rhs_var.type.void?
|
937
919
|
# NOTE: To detect bad value reference of `void' expressions.
|
938
920
|
return create_tmpvar
|
939
|
-
when rhs_var != rhs_obj
|
940
|
-
notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
|
941
921
|
end
|
942
922
|
|
943
923
|
# NOTE: The ISO C99 standard says;
|
@@ -984,21 +964,15 @@ module Cc1 #:nodoc:
|
|
984
964
|
|
985
965
|
def eval_relational_expr(node, lhs_obj, rhs_obj)
|
986
966
|
lhs_var = object_to_variable(lhs_obj)
|
987
|
-
|
988
|
-
when !lhs_var.type.scalar? && !lhs_var.type.void?
|
967
|
+
if !lhs_var.type.scalar? && !lhs_var.type.void?
|
989
968
|
# NOTE: To detect bad value reference of `void' expressions.
|
990
969
|
return create_tmpvar(int_t, scalar_value_of_arbitrary)
|
991
|
-
when lhs_var != lhs_obj
|
992
|
-
notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
|
993
970
|
end
|
994
971
|
|
995
972
|
rhs_var = object_to_variable(rhs_obj)
|
996
|
-
|
997
|
-
when !rhs_var.type.scalar? && !rhs_var.type.void?
|
973
|
+
if !rhs_var.type.scalar? && !rhs_var.type.void?
|
998
974
|
# NOTE: To detect bad value reference of `void' expressions.
|
999
975
|
return create_tmpvar(int_t, scalar_value_of_arbitrary)
|
1000
|
-
when rhs_var != rhs_obj
|
1001
|
-
notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
|
1002
976
|
end
|
1003
977
|
|
1004
978
|
lhs_conved, rhs_conved =
|
@@ -1035,21 +1009,15 @@ module Cc1 #:nodoc:
|
|
1035
1009
|
|
1036
1010
|
def eval_equality_expr(node, lhs_obj, rhs_obj)
|
1037
1011
|
lhs_var = object_to_variable(lhs_obj)
|
1038
|
-
|
1039
|
-
when !lhs_var.type.scalar? && !lhs_var.type.void?
|
1012
|
+
if !lhs_var.type.scalar? && !lhs_var.type.void?
|
1040
1013
|
# NOTE: To detect bad value reference of `void' expressions.
|
1041
1014
|
return create_tmpvar(int_t, scalar_value_of_arbitrary)
|
1042
|
-
when lhs_var != lhs_obj
|
1043
|
-
notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
|
1044
1015
|
end
|
1045
1016
|
|
1046
1017
|
rhs_var = object_to_variable(rhs_obj)
|
1047
|
-
|
1048
|
-
when !rhs_var.type.scalar? && !rhs_var.type.void?
|
1018
|
+
if !rhs_var.type.scalar? && !rhs_var.type.void?
|
1049
1019
|
# NOTE: To detect bad value reference of `void' expressions.
|
1050
1020
|
return create_tmpvar(int_t, scalar_value_of_arbitrary)
|
1051
|
-
when rhs_var != rhs_obj
|
1052
|
-
notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
|
1053
1021
|
end
|
1054
1022
|
|
1055
1023
|
lhs_conved, rhs_conved =
|
@@ -1082,21 +1050,15 @@ module Cc1 #:nodoc:
|
|
1082
1050
|
|
1083
1051
|
def eval_and_expr(node, lhs_obj, rhs_obj)
|
1084
1052
|
lhs_var = object_to_variable(lhs_obj)
|
1085
|
-
|
1086
|
-
when !lhs_var.type.scalar? && !lhs_var.type.void?
|
1053
|
+
if !lhs_var.type.scalar? && !lhs_var.type.void?
|
1087
1054
|
# NOTE: To detect bad value reference of `void' expressions.
|
1088
1055
|
return create_tmpvar
|
1089
|
-
when lhs_var != lhs_obj
|
1090
|
-
notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
|
1091
1056
|
end
|
1092
1057
|
|
1093
1058
|
rhs_var = object_to_variable(rhs_obj)
|
1094
|
-
|
1095
|
-
when !rhs_var.type.scalar? && !rhs_var.type.void?
|
1059
|
+
if !rhs_var.type.scalar? && !rhs_var.type.void?
|
1096
1060
|
# NOTE: To detect bad value reference of `void' expressions.
|
1097
1061
|
return create_tmpvar
|
1098
|
-
when rhs_var != rhs_obj
|
1099
|
-
notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
|
1100
1062
|
end
|
1101
1063
|
|
1102
1064
|
lhs_conved, rhs_conved =
|
@@ -1124,21 +1086,15 @@ module Cc1 #:nodoc:
|
|
1124
1086
|
|
1125
1087
|
def eval_exclusive_or_expr(node, lhs_obj, rhs_obj)
|
1126
1088
|
lhs_var = object_to_variable(lhs_obj)
|
1127
|
-
|
1128
|
-
when !lhs_var.type.scalar? && !lhs_var.type.void?
|
1089
|
+
if !lhs_var.type.scalar? && !lhs_var.type.void?
|
1129
1090
|
# NOTE: To detect bad value reference of `void' expressions.
|
1130
1091
|
return create_tmpvar
|
1131
|
-
when lhs_var != lhs_obj
|
1132
|
-
notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
|
1133
1092
|
end
|
1134
1093
|
|
1135
1094
|
rhs_var = object_to_variable(rhs_obj)
|
1136
|
-
|
1137
|
-
when !rhs_var.type.scalar? && !rhs_var.type.void?
|
1095
|
+
if !rhs_var.type.scalar? && !rhs_var.type.void?
|
1138
1096
|
# NOTE: To detect bad value reference of `void' expressions.
|
1139
1097
|
return create_tmpvar
|
1140
|
-
when rhs_var != rhs_obj
|
1141
|
-
notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
|
1142
1098
|
end
|
1143
1099
|
|
1144
1100
|
lhs_conved, rhs_conved =
|
@@ -1166,21 +1122,15 @@ module Cc1 #:nodoc:
|
|
1166
1122
|
|
1167
1123
|
def eval_inclusive_or_expr(node, lhs_obj, rhs_obj)
|
1168
1124
|
lhs_var = object_to_variable(lhs_obj)
|
1169
|
-
|
1170
|
-
when !lhs_var.type.scalar? && !lhs_var.type.void?
|
1125
|
+
if !lhs_var.type.scalar? && !lhs_var.type.void?
|
1171
1126
|
# NOTE: To detect bad value reference of `void' expressions.
|
1172
1127
|
return create_tmpvar
|
1173
|
-
when lhs_var != lhs_obj
|
1174
|
-
notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
|
1175
1128
|
end
|
1176
1129
|
|
1177
1130
|
rhs_var = object_to_variable(rhs_obj)
|
1178
|
-
|
1179
|
-
when !rhs_var.type.scalar? && !rhs_var.type.void?
|
1131
|
+
if !rhs_var.type.scalar? && !rhs_var.type.void?
|
1180
1132
|
# NOTE: To detect bad value reference of `void' expressions.
|
1181
1133
|
return create_tmpvar
|
1182
|
-
when rhs_var != rhs_obj
|
1183
|
-
notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
|
1184
1134
|
end
|
1185
1135
|
|
1186
1136
|
lhs_conved, rhs_conved =
|
@@ -1207,16 +1157,8 @@ module Cc1 #:nodoc:
|
|
1207
1157
|
end
|
1208
1158
|
|
1209
1159
|
def eval_simple_assignment_expr(node, lhs_obj, rhs_obj)
|
1210
|
-
|
1211
|
-
lhs_var = lhs_obj
|
1212
|
-
else
|
1213
|
-
return lhs_obj
|
1214
|
-
end
|
1215
|
-
|
1160
|
+
lhs_var = object_to_variable(lhs_obj)
|
1216
1161
|
rhs_var = object_to_variable(rhs_obj)
|
1217
|
-
unless rhs_var == rhs_obj
|
1218
|
-
notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
|
1219
|
-
end
|
1220
1162
|
|
1221
1163
|
if rhs_var.type.same_as?(lhs_var.type)
|
1222
1164
|
rhs_conved = rhs_var
|
@@ -1240,19 +1182,16 @@ module Cc1 #:nodoc:
|
|
1240
1182
|
end
|
1241
1183
|
|
1242
1184
|
def eval_compound_assignment_expr(node, lhs_obj, rhs_obj)
|
1243
|
-
|
1244
|
-
|
1245
|
-
|
1185
|
+
lhs_var = object_to_variable(lhs_obj)
|
1186
|
+
if !lhs_var.type.scalar? && !lhs_var.type.void?
|
1187
|
+
# NOTE: To detect bad value reference of `void' expressions.
|
1246
1188
|
return lhs_obj
|
1247
1189
|
end
|
1248
1190
|
|
1249
1191
|
rhs_var = object_to_variable(rhs_obj)
|
1250
|
-
|
1251
|
-
when !rhs_var.type.scalar? && !rhs_var.type.void?
|
1192
|
+
if !rhs_var.type.scalar? && !rhs_var.type.void?
|
1252
1193
|
# NOTE: To detect bad value reference of `void' expressions.
|
1253
|
-
return
|
1254
|
-
when rhs_var != rhs_obj
|
1255
|
-
notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
|
1194
|
+
return lhs_var
|
1256
1195
|
end
|
1257
1196
|
|
1258
1197
|
case node.operator.type
|
data/lib/adlint/cc1/interp.rb
CHANGED
@@ -430,14 +430,22 @@ module Cc1 #:nodoc:
|
|
430
430
|
def object_to_variable(obj)
|
431
431
|
case
|
432
432
|
when obj.function?
|
433
|
-
|
434
|
-
when obj.type.array?
|
435
|
-
|
433
|
+
function_to_pointer(obj)
|
434
|
+
when obj.variable? && obj.type.array?
|
435
|
+
array_to_pointer(obj)
|
436
436
|
else
|
437
437
|
obj
|
438
438
|
end
|
439
439
|
end
|
440
440
|
|
441
|
+
def function_to_pointer(fun)
|
442
|
+
create_tmpvar(pointer_type(fun.type), pointer_value_of(fun))
|
443
|
+
end
|
444
|
+
|
445
|
+
def array_to_pointer(ary)
|
446
|
+
create_tmpvar(pointer_type(ary.type.base_type), pointer_value_of(ary))
|
447
|
+
end
|
448
|
+
|
441
449
|
def value_of(obj)
|
442
450
|
if obj.type.array? || obj.type.function?
|
443
451
|
pointer_value_of(obj)
|
data/lib/adlint/memo.rb
CHANGED
@@ -33,124 +33,125 @@ module AdLint #:nodoc:
|
|
33
33
|
|
34
34
|
module Memoizable
|
35
35
|
def memoize(name, *key_indices)
|
36
|
-
|
37
|
-
|
36
|
+
if instance_method(name).arity == 0
|
37
|
+
memoize_noarg_method(name)
|
38
|
+
else
|
39
|
+
memoize_ordinary_method(name, key_indices)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
def memoize_noarg_method(name)
|
45
|
+
save_memoizing_method(name)
|
46
|
+
prepare_noarg_method_cache(name)
|
38
47
|
class_eval <<-EOS
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
@_cache_of__#{var_name}
|
51
|
-
else
|
52
|
-
@_cache_of__#{var_name}_forbidden ||= false
|
53
|
-
if @_cache_of__#{var_name}_forbidden
|
54
|
-
@_cache_of__#{var_name}_forbidden = false
|
55
|
-
#{org_name}
|
56
|
-
else
|
57
|
-
@_cache_of__#{var_name}_initialized = true
|
58
|
-
@_cache_of__#{var_name} = #{org_name}
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
EOS
|
63
|
-
else
|
64
|
-
define_cache_manipulator(name, var_name, key_indices)
|
65
|
-
class_eval <<-EOS
|
66
|
-
define_method("#{name}") do |*args|
|
67
|
-
@_cache_of__#{var_name}_initialized ||= false
|
68
|
-
if @_cache_of__#{var_name}_initialized
|
69
|
-
@_cache_of__#{var_name}_forbidden = false
|
70
|
-
if @_cache_of__#{var_name}.include?(args)
|
71
|
-
@_cache_of__#{var_name}[args]
|
72
|
-
else
|
73
|
-
@_cache_of__#{var_name}[args] = #{org_name}(*args)
|
74
|
-
end
|
75
|
-
else
|
76
|
-
@_cache_of__#{var_name}_forbidden ||= false
|
77
|
-
if @_cache_of__#{var_name}_forbidden
|
78
|
-
@_cache_of__#{var_name}_forbidden = false
|
79
|
-
#{org_name}(*args)
|
80
|
-
else
|
81
|
-
@_cache_of__#{var_name}_initialized = true
|
82
|
-
@_cache_of__#{var_name} = {}
|
83
|
-
@_cache_of__#{var_name}[args] = #{org_name}(*args)
|
84
|
-
end
|
85
|
-
end
|
48
|
+
define_method(:#{name}) do
|
49
|
+
if #{cache_name_of(name)}_initialized ||= false
|
50
|
+
#{cache_name_of(name)}_forbidden = false
|
51
|
+
#{cache_name_of(name)}
|
52
|
+
else
|
53
|
+
if #{cache_name_of(name)}_forbidden ||= false
|
54
|
+
#{cache_name_of(name)}_forbidden = false
|
55
|
+
#{org_name_of(name)}
|
56
|
+
else
|
57
|
+
#{cache_name_of(name)}_initialized = true
|
58
|
+
#{cache_name_of(name)} = #{org_name_of(name)}
|
86
59
|
end
|
87
|
-
|
60
|
+
end
|
88
61
|
end
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
62
|
+
EOS
|
63
|
+
end
|
64
|
+
|
65
|
+
def memoize_ordinary_method(name, key_indices)
|
66
|
+
save_memoizing_method(name)
|
67
|
+
prepare_ordinary_method_cache(name, key_indices)
|
68
|
+
class_eval <<-EOS
|
69
|
+
define_method(:#{name}) do |*args|
|
70
|
+
key = __key_for_#{name}(*args)
|
71
|
+
if #{cache_name_of(name)}_initialized ||= false
|
72
|
+
#{cache_name_of(name)}_forbidden = false
|
73
|
+
if #{cache_name_of(name)}.include?(key)
|
74
|
+
#{cache_name_of(name)}[key]
|
75
|
+
else
|
76
|
+
#{cache_name_of(name)}[key] = #{org_name_of(name)}(*args)
|
77
|
+
end
|
78
|
+
else
|
79
|
+
if #{cache_name_of(name)}_forbidden ||= false
|
80
|
+
#{cache_name_of(name)}_forbidden = false
|
81
|
+
#{org_name_of(name)}(*args)
|
102
82
|
else
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
#{org_name}(*args)
|
107
|
-
else
|
108
|
-
@_cache_of__#{var_name}_initialized = true
|
109
|
-
@_cache_of__#{var_name} = {}
|
110
|
-
@_cache_of__#{var_name}[key] = #{org_name}(*args)
|
111
|
-
end
|
83
|
+
#{cache_name_of(name)}_initialized = true
|
84
|
+
#{cache_name_of(name)} = {}
|
85
|
+
#{cache_name_of(name)}[key] = #{org_name_of(name)}(*args)
|
112
86
|
end
|
113
87
|
end
|
114
|
-
|
115
|
-
|
88
|
+
end
|
89
|
+
EOS
|
116
90
|
end
|
117
91
|
|
118
|
-
|
119
|
-
def define_cache_manipulator(name, var_name, key_indices = nil)
|
92
|
+
def prepare_noarg_method_cache(name)
|
120
93
|
class_eval <<-EOS
|
121
|
-
define_method(
|
122
|
-
|
94
|
+
define_method(:forbid_once_memo_of__#{name}) do
|
95
|
+
#{cache_name_of(name)}_forbidden = true
|
123
96
|
end
|
124
|
-
define_method(
|
125
|
-
|
126
|
-
|
97
|
+
define_method(:clear_memo_of__#{name}) do
|
98
|
+
#{cache_name_of(name)} = nil
|
99
|
+
#{cache_name_of(name)}_initialized = false
|
100
|
+
end
|
101
|
+
define_method(:forget_memo_of__#{name}) do
|
102
|
+
clear_memo_of__#{name}
|
127
103
|
end
|
128
104
|
EOS
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
105
|
+
end
|
106
|
+
|
107
|
+
def prepare_ordinary_method_cache(name, key_indices)
|
108
|
+
define_key_generator(name, key_indices)
|
109
|
+
class_eval <<-EOS
|
110
|
+
define_method(:forbid_once_memo_of__#{name}) do
|
111
|
+
#{cache_name_of(name)}_forbidden = true
|
112
|
+
end
|
113
|
+
define_method(:clear_memo_of__#{name}) do
|
114
|
+
#{cache_name_of(name)} = nil
|
115
|
+
#{cache_name_of(name)}_initialized = false
|
116
|
+
end
|
117
|
+
define_method(:forget_memo_of__#{name}) do |*args|
|
118
|
+
if #{cache_name_of(name)}_initialized
|
119
|
+
#{cache_name_of(name)}.delete(__key_for_#{name}(*args))
|
136
120
|
end
|
137
|
-
|
138
|
-
|
121
|
+
end
|
122
|
+
EOS
|
123
|
+
end
|
124
|
+
|
125
|
+
def define_key_generator(name, key_indices)
|
126
|
+
if key_indices.empty?
|
139
127
|
class_eval <<-EOS
|
140
|
-
define_method(
|
141
|
-
|
142
|
-
key = args.values_at(#{key_indices.join(',')})
|
143
|
-
@_cache_of__#{var_name}.delete(key)
|
144
|
-
end
|
128
|
+
define_method(:__key_for_#{name}) do |*args|
|
129
|
+
args
|
145
130
|
end
|
146
131
|
EOS
|
147
132
|
else
|
148
133
|
class_eval <<-EOS
|
149
|
-
define_method(
|
150
|
-
|
134
|
+
define_method(:__key_for_#{name}) do |*args|
|
135
|
+
args.values_at(#{key_indices.join(',')})
|
151
136
|
end
|
152
137
|
EOS
|
153
138
|
end
|
139
|
+
class_eval "private(:__key_for_#{name})"
|
140
|
+
end
|
141
|
+
|
142
|
+
def save_memoizing_method(name)
|
143
|
+
class_eval <<-EOS
|
144
|
+
alias_method(:#{org_name_of(name)}, :#{name})
|
145
|
+
private(:#{org_name_of(name)})
|
146
|
+
EOS
|
147
|
+
end
|
148
|
+
|
149
|
+
def cache_name_of(name)
|
150
|
+
"@__cache_of__#{name.to_s.sub("?", "Q")}"
|
151
|
+
end
|
152
|
+
|
153
|
+
def org_name_of(name)
|
154
|
+
"__org_#{name}"
|
154
155
|
end
|
155
156
|
end
|
156
157
|
|
data/lib/adlint/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
<html lang="ja">
|
2
2
|
<head>
|
3
|
-
<title>AdLint 3.0.
|
3
|
+
<title>AdLint 3.0.2 開発者ガイド</title>
|
4
4
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
5
|
-
<meta name="description" content="AdLint 3.0.
|
5
|
+
<meta name="description" content="AdLint 3.0.2 開発者ガイド">
|
6
6
|
<meta name="generator" content="makeinfo 4.13">
|
7
7
|
<link title="Top" rel="top" href="#Top">
|
8
8
|
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
@@ -44,7 +44,7 @@ td { border: 1px solid black; }
|
|
44
44
|
--></style>
|
45
45
|
</head>
|
46
46
|
<body>
|
47
|
-
<h1 class="settitle">AdLint 3.0.
|
47
|
+
<h1 class="settitle">AdLint 3.0.2 開発者ガイド</h1>
|
48
48
|
<div class="contents">
|
49
49
|
<h2>Table of Contents</h2>
|
50
50
|
<ul>
|
@@ -1,8 +1,8 @@
|
|
1
1
|
<html lang="en">
|
2
2
|
<head>
|
3
|
-
<title>AdLint 3.0.
|
3
|
+
<title>AdLint 3.0.2 User's Guide</title>
|
4
4
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
5
|
-
<meta name="description" content="AdLint 3.0.
|
5
|
+
<meta name="description" content="AdLint 3.0.2 User's Guide">
|
6
6
|
<meta name="generator" content="makeinfo 4.13">
|
7
7
|
<link title="Top" rel="top" href="#Top">
|
8
8
|
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
@@ -44,7 +44,7 @@ td { border: 1px solid black; }
|
|
44
44
|
--></style>
|
45
45
|
</head>
|
46
46
|
<body>
|
47
|
-
<h1 class="settitle">AdLint 3.0.
|
47
|
+
<h1 class="settitle">AdLint 3.0.2 User's Guide</h1>
|
48
48
|
<div class="node">
|
49
49
|
<a name="Top"></a>
|
50
50
|
<p><hr>
|
@@ -2420,7 +2420,7 @@ Up: <a rel="up" accesskey="u" href="#Top">Top</a>
|
|
2420
2420
|
<li><a href="#W0093">W0093</a>: This expression may cause division-by-zero.
|
2421
2421
|
<li><a href="#W0096">W0096</a>: It divided by a constant expression which definitely zero.
|
2422
2422
|
<li><a href="#W0097">W0097</a>: This expression must cause division-by-zero.
|
2423
|
-
<li><a href="#W0100">W0100</a>: The
|
2423
|
+
<li><a href="#W0100">W0100</a>: The variable `%s' has not been reassigned since the initial value is assigned. It may be able to be defined as `const' with an initial value.
|
2424
2424
|
<li><a href="#W0101">W0101</a>: An address of auto variable is substituted for a pointer which has a longer life. This program is danger.
|
2425
2425
|
<li><a href="#W0102">W0102</a>: An address of auto variable is returned via formal argument to functions. This program is danger.
|
2426
2426
|
<li><a href="#W0103">W0103</a>: An address of auto variable is returned as return value from a function. This program is danger.
|
@@ -6270,7 +6270,7 @@ Up: <a rel="up" accesskey="u" href="#Messages">Messages</a>
|
|
6270
6270
|
|
6271
6271
|
<h4 class="subsection">6.83.1 Message body</h4>
|
6272
6272
|
|
6273
|
-
<p>The
|
6273
|
+
<p>The variable `%s' has not been reassigned since the initial value is assigned. It may be able to be defined as `const' with an initial value.
|
6274
6274
|
|
6275
6275
|
<h4 class="subsection">6.83.2 Content</h4>
|
6276
6276
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
@setfilename users_guide_en.info
|
3
3
|
@documentlanguage en
|
4
4
|
@documentencoding utf-8
|
5
|
-
@settitle AdLint 3.0.
|
5
|
+
@settitle AdLint 3.0.2 User's Guide
|
6
6
|
|
7
7
|
@copying
|
8
8
|
Copyright (C) 2010-2013, OGIS-RI Co.,Ltd.
|
@@ -2457,7 +2457,7 @@ context_line
|
|
2457
2457
|
* W0093::This expression may cause division-by-zero.
|
2458
2458
|
* W0096::It divided by a constant expression which definitely zero.
|
2459
2459
|
* W0097::This expression must cause division-by-zero.
|
2460
|
-
* W0100::The
|
2460
|
+
* W0100::The variable `%s' has not been reassigned since the initial value is assigned. It may be able to be defined as `const' with an initial value.
|
2461
2461
|
* W0101::An address of auto variable is substituted for a pointer which has a longer life. This program is danger.
|
2462
2462
|
* W0102::An address of auto variable is returned via formal argument to functions. This program is danger.
|
2463
2463
|
* W0103::An address of auto variable is returned as return value from a function. This program is danger.
|
@@ -5646,7 +5646,7 @@ None.
|
|
5646
5646
|
|
5647
5647
|
@subsection Message body
|
5648
5648
|
|
5649
|
-
The
|
5649
|
+
The variable `%s' has not been reassigned since the initial value is assigned. It may be able to be defined as `const' with an initial value.
|
5650
5650
|
|
5651
5651
|
@subsection Content
|
5652
5652
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
<html lang="ja">
|
2
2
|
<head>
|
3
|
-
<title>AdLint 3.0.
|
3
|
+
<title>AdLint 3.0.2 利用者ガイド</title>
|
4
4
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
5
|
-
<meta name="description" content="AdLint 3.0.
|
5
|
+
<meta name="description" content="AdLint 3.0.2 利用者ガイド">
|
6
6
|
<meta name="generator" content="makeinfo 4.13">
|
7
7
|
<link title="Top" rel="top" href="#Top">
|
8
8
|
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
@@ -44,7 +44,7 @@ td { border: 1px solid black; }
|
|
44
44
|
--></style>
|
45
45
|
</head>
|
46
46
|
<body>
|
47
|
-
<h1 class="settitle">AdLint 3.0.
|
47
|
+
<h1 class="settitle">AdLint 3.0.2 利用者ガイド</h1>
|
48
48
|
<div class="node">
|
49
49
|
<a name="Top"></a>
|
50
50
|
<p><hr>
|
@@ -2486,7 +2486,7 @@ Up: <a rel="up" accesskey="u" href="#Top">Top</a>
|
|
2486
2486
|
<li><a href="#W0093">W0093</a>: ゼロで除算される恐れがあります。
|
2487
2487
|
<li><a href="#W0096">W0096</a>: ゼロになる定数式で除算しています。
|
2488
2488
|
<li><a href="#W0097">W0097</a>: ゼロの値で除算しています。
|
2489
|
-
<li><a href="#W0100">W0100</a>: 変数 `%s'
|
2489
|
+
<li><a href="#W0100">W0100</a>: 変数 `%s' は初期値を設定後に再代入されません。変数を const 付きで初期値を指定して定義できる可能性があります。
|
2490
2490
|
<li><a href="#W0101">W0101</a>: 自動変数のアドレスが、より長い寿命を持つポインタに代入されています。このプログラムは危険です。
|
2491
2491
|
<li><a href="#W0102">W0102</a>: 自動変数のアドレスが、関数の仮引数を介して戻されています。このプログラムは危険です。
|
2492
2492
|
<li><a href="#W0103">W0103</a>: 自動変数のアドレスが、戻り値として関数から返されています。このプログラムは危険です。
|
@@ -6390,7 +6390,7 @@ Up: <a rel="up" accesskey="u" href="#Messages">Messages</a>
|
|
6390
6390
|
|
6391
6391
|
<h4 class="subsection">6.83.1 メッセージ本文</h4>
|
6392
6392
|
|
6393
|
-
<p>変数 `%s'
|
6393
|
+
<p>変数 `%s' は初期値を設定後に再代入されません。変数を const 付きで初期値を指定して定義できる可能性があります。
|
6394
6394
|
|
6395
6395
|
<h4 class="subsection">6.83.2 内容</h4>
|
6396
6396
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
@setfilename users_guide_ja.info
|
3
3
|
@documentlanguage ja
|
4
4
|
@documentencoding utf-8
|
5
|
-
@settitle AdLint 3.0.
|
5
|
+
@settitle AdLint 3.0.2 利用者ガイド
|
6
6
|
|
7
7
|
@copying
|
8
8
|
Copyright (C) 2010-2013, OGIS-RI Co.,Ltd.
|
@@ -2517,7 +2517,7 @@ context_line
|
|
2517
2517
|
* W0093::ゼロで除算される恐れがあります。
|
2518
2518
|
* W0096::ゼロになる定数式で除算しています。
|
2519
2519
|
* W0097::ゼロの値で除算しています。
|
2520
|
-
* W0100::変数 `%s'
|
2520
|
+
* W0100::変数 `%s' は初期値を設定後に再代入されません。変数を const 付きで初期値を指定して定義できる可能性があります。
|
2521
2521
|
* W0101::自動変数のアドレスが、より長い寿命を持つポインタに代入されています。このプログラムは危険です。
|
2522
2522
|
* W0102::自動変数のアドレスが、関数の仮引数を介して戻されています。このプログラムは危険です。
|
2523
2523
|
* W0103::自動変数のアドレスが、戻り値として関数から返されています。このプログラムは危険です。
|
@@ -5753,7 +5753,7 @@ int func(int a, int b)
|
|
5753
5753
|
|
5754
5754
|
@subsection メッセージ本文
|
5755
5755
|
|
5756
|
-
変数 `%s'
|
5756
|
+
変数 `%s' は初期値を設定後に再代入されません。変数を const 付きで初期値を指定して定義できる可能性があります。
|
5757
5757
|
|
5758
5758
|
@subsection 内容
|
5759
5759
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adlint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-04-12 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! 'AdLint is a source code static analyzer.
|
15
15
|
|