adlint 3.0.0 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
|