Lucky hour! Grab a free trial license — offer ends in 00:59:58. Claim now
PVS-Studio is constantly evolving. Our team actively improves the tool's integration with various CI/CD pipelines and IDEs, and supports new platforms and compilers. The number of diagnostic rules in the analyzer is an effective way to showcase its enhancements.
Figure 1. A graph showing the increasing number of diagnostics in PVS-Studio
We are continuously enhancing the analyzer's capability to detect new error patterns. Below, you can learn more about new features in different analyzer versions. You can also explore the PVS-Studio updates over the past year in our blog.
We organized most of the diagnostic rules into several groups, so that you can get a general idea of what PVS-Studio is capable of.
Since the categorization is quite arbitrary, some diagnostic rules fall into multiple groups. For example, the if (abc == abc) incorrect condition can be interpreted both as a simple typo and as a security issue, because it may lead to a code vulnerability if the input data are incorrect.
Some of the errors, on the contrary, did not make it into the table because they were too specific. Nevertheless, this table provides insight into the features of the static code analyzer.
|
Main PVS-Studio diagnostic rule capabilities |
Diagnostic rules |
|---|---|
|
64-bit issues |
C, C++: V101-V128, V201-V207, V220, V221, V301-V303 |
|
Check that addresses to stack memory does not leave the function |
C, C++: V506, V507, V558, V723, V758, V1017, V1047 |
|
Arithmetic over/underflow |
C, C++: V569, V636, V658, V784, V786, V1012, V1026, V1028, V1029, V1033, V1070, V1081, V1083, V1085, V1112
C#: V3041, V3200, V3204, V3217
Java: V5308, V6011, V6088, V6117 |
|
Array index out of bounds |
C, C++: V557, V582, V643, V781, V1038, V1111
C#: V3106, V3218
Java: V6025, V6079
Go: V8031 |
|
Double-free |
C, C++: V586, V749, V1002, V1006 |
|
Dead code |
C, C++: V606, V607
Java: V6021
JavaScript and TypeScript: V7003
Go: V8021, V8024 |
|
Microoptimization |
C, C++: V801, V802, V803, V804, V805, V806, V807, V808, V809, V810, V811, V812, V813, V814, V815, V816, V817, V818, V819, V820, V821, V822, V823, V824, V825, V826, V827, V828, V829, V830, V831, V832, V833, V834, V835, V836, V837, V838, V839
C#: V4001, V4002, V4003, V4004, V4005, V4006, V4007, V4008 |
|
Unreachable code |
C, C++: V517, V551, V695, V734, V776, V779, V785
C#: V3136, V3142, V3202
Java: V6018, V6019
Go: V8025 |
|
Uninitialized variables |
C, C++: V573, V614, V679, V737, V788, V1007, V1050, V1077, V1086
C#: V3070, V3128
Java: V6036, V6050, V6052, V6090 |
|
Unused variables |
C, C++: V603, V751, V763, V1001, V1079
C#: V3061, V3065, V3077, V3117, V3137, V3143, V3196, V3203, V3220
Java: V6021, V6022, V6023
JavaScript and TypeScript: V7009
Go: V8022 |
|
Illegal bitwise/shift operations |
C, C++: V610, V629, V673, V684, V770, V1093
C#: V3134
Java: V6034, V6069 |
|
Undefined/unspecified behavior |
C, C++: V567, V610, V611, V681, V694, V704, V708, V726, V736, V772, V1007, V1016, V1026, V1032, V1061, V1066, V1069, V1082, V1091, V1094, V1097, V1099
Java: V6128 |
|
Incorrect handling of the types (HRESULT, BSTR, BOOL, VARIANT_BOOL, float, double) |
C, C++: V543, V544, V545, V556, V615, V636, V676, V716, V721, V724, V745, V750, V767, V768, V771, V772, V775, V1014, V1027, V1034, V1046, V1060, V1066, V1084
C#: V3041, V3059, V3076, V3111, V3121, V3148
Java: V6038, V6108
JavaScript and TypeScript: V7011
Go: V8018 |
|
Improper understanding of function/class operation logic |
C, C++: V515, V518, V530, V540, V541, V554, V575, V597, V598, V618, V630, V632, V663, V668, V698, V701, V702, V717, V718, V720, V723, V725, V727, V738, V742, V743, V748, V762, V764, V780, V789, V797, V1014, V1024, V1031, V1035, V1045, V1052, V1053, V1054, V1057, V1060, V1066, V1098, V1100, V1107, V1115
C#: V3010, V3057, V3068, V3072, V3073, V3074, V3078, V3082, V3084, V3094, V3096, V3097, V3102, V3103, V3104, V3108, V3114, V3115, V3118, V3123, V3126, V3145, V3178, V3186, V3192, V3194, V3195, V3197
Java: V6009, V6010, V6016, V6026, V6029, V6049, V6055, V6058, V6064, V6068, V6081, V6110, V6116, V6122, V6125, V6133, V6134
JavaScript and TypeScript: V7010
Go: V8008, V8015, V8032 |
|
Misprints |
C, C++: V501, V503, V504, V508, V511, V516, V519, V520, V521, V525, V527, V528, V529, V532, V533, V534, V535, V536, V537, V539, V546, V549, V552, V556, V559, V560, V561, V564, V568, V570, V571, V575, V577, V578, V584, V587, V588, V589, V590, V592, V602, V604, V606, V607, V616, V617, V620, V621, V622, V625, V626, V627, V633, V637, V638, V639, V644, V646, V650, V651, V653, V654, V655, V657, V660, V661, V662, V666, V669, V671, V672, V678, V682, V683, V693, V715, V722, V735, V741, V747, V753, V754, V756, V765, V767, V768, V770, V771, V787, V791, V792, V796, V1013, V1015, V1021, V1040, V1051, V1055, V1074, V1094, V1113
C#: V3001, V3003, V3005, V3007, V3008, V3009, V3011, V3012, V3014, V3015, V3016, V3020, V3028, V3029, V3034, V3035, V3036, V3037, V3038, V3050, V3055, V3056, V3057, V3060, V3062, V3063, V3066, V3081, V3086, V3091, V3092, V3093, V3102, V3107, V3109, V3110, V3112, V3113, V3116, V3118, V3122, V3124, V3132, V3140, V3170, V3174, V3185, V3187, V3228
Java: V6001, V6005, V6009, V6012, V6014, V6015, V6016, V6017, V6021, V6026, V6028, V6029, V6030, V6031, V6037, V6041, V6042, V6043, V6045, V6057, V6059, V6061, V6062, V6063, V6077, V6080, V6085, V6091, V6105, V6112
JavaScript and TypeScript: V7001, V7005, V7007, V7009, V7013, V7014, V7015, V7016, V7017, V7019, V7022, V7024, V7029, V7031
Go: V8001, V8002, V8003, V8004, V8006, V8007, V8008, V8011, V8012, V8016, V8017, V8023, V8027, V8029 |
|
Missing Virtual destructor |
C, C++: V599, V689 |
|
Coding style not matching the operation logic of the source code |
C, C++: V563, V612, V628, V640, V646, V705, V709, V715, V1044, V1073
C#: V3007, V3018, V3033, V3043, V3067, V3069, V3138, V3150, V3172, V3183
Java: V6040, V6047, V6063, V6086, V6089, V6132
JavaScript and TypeScript: V7020, V7022, V7026, V7029, V7030 |
|
Copy-Paste |
C, C++: V501, V517, V519, V523, V524, V571, V581, V649, V656, V666, V691, V760, V766, V778, V1037
C#: V3001, V3003, V3004, V3008, V3012, V3013, V3021, V3030, V3058, V3127, V3139, V3140, V3228
Java: V6003, V6004, V6012, V6021, V6027, V6032, V6033, V6039, V6067, V6072
JavaScript and TypeScript: V7002, V7003, V7004, V7008, V7012, V7023
Go: V8001, V8004, V8005, V8009, V8010, V8012, V8014, V8017, V8019, V8020 |
|
Incorrect usage of exceptions |
C, C++: V509, V565, V596, V667, V668, V740, V741, V746, V759, V1022, V1045, V1067, V1090
C#: V3006, V3052, V3100, V3141, V3163, V3164, V5602, V5603, V5606, V5607
Java: V5301, V5302, V5303, V5306, V6006, V6051, V6103, V6118, V6134
JavaScript and TypeScript: V7006
Go: V8007 |
|
Buffer overrun |
C, C++: V512, V514, V594, V635, V641, V645, V752, V755 |
|
Security issues |
C, C++: V505, V510, V511, V512, V518, V531, V541, V547, V559, V560, V569, V570, V575, V576, V579, V583, V597, V598, V618, V623, V631, V642, V645, V675, V676, V724, V727, V729, V733, V743, V745, V750, V771, V774, V782, V1001, V1003, V1005, V1010, V1017, V1055, V1072, V1076, V1113, V1118
C#: V3022, V3023, V3025, V3027, V3039, V3053, V3063, V3225, V3232, V5601, V5608, V5609, V5610, V5611, V5612, V5613, V5614, V5615, V5616, V5617, V5618, V5619, V5620, V5621, V5622, V5623, V5624, V5625, V5626, V5627, V5628, V5629, V5630, V5631
Java: V5305, V5307, V5309, V5312, V5313, V5314, V5315, V5316, V5317, V5318, V5319, V5320, V5321, V5322, V5323, V5325, V5326, V5327, V5328, V5329, V5330, V5331, V5332, V5333, V5334, V5335, V5336, V5337, V5338, V5339, V5340, V6007, V6046, V6054, V6109
JavaScript and TypeScript: V5801, V7013
Go: V5901 |
|
Operation priority |
C, C++: V502, V562, V593, V634, V648, V727, V733, V1003, V1104
C#: V3130, V3133, V3177, V3207
Java: V6044
JavaScript and TypeScript: V7021 |
|
Null pointer / null reference dereference |
C, C++: V522, V595, V664, V713, V757, V769
C#: V3019, V3042, V3080, V3095, V3105, V3125, V3141, V3145, V3146, V3148, V3149, V3153, V3156, V3168, V3195
Java: V6008, V6060, V6093 |
|
Unchecked parameter dereference |
C, C++: V595, V664, V783, V1004
C#: V3095
Java: V6060 |
|
Synchronization errors |
C, C++: V712, V720, V744, V1011, V1018, V1025, V1036, V1088, V1089, V1114
C#: V3032, V3054, V3079, V3082, V3083, V3089, V3090, V3147, V3167, V3168, V3190, V3223, V5604, V5605
Java: V5304, V6064, V6070, V6074, V6082, V6095, V6102, V6125, V6126, V6129 |
|
Resource leaks |
C, C++: V599, V701, V773, V1020, V1023, V1100, V1106, V1110
Java: V6127 |
|
Check for integer division by zero |
C, C++: V609
C#: V3064, V3151, V3152
Java: V6020 |
|
Serialization / deserialization issues |
C, C++: V513, V663, V739, V1024, V1095
C#: V3094, V3096, V3097, V3099, V3103, V3104, V3193, V5611
Java: V6065, V6075, V6076, V6083, V6087 |
|
Customized user rules |
C, C++: V2001, V2002, V2003, V2004, V2005, V2006, V2007, V2008, V2009, V2010, V2011, V2012, V2013, V2014, V2022 |
The table outlines the capabilities of PVS-Studio.
As you can see, the analyzer is best at detecting security flaws, as well as errors caused by typos and copy-paste operations.
To see these diagnostic rules in action, you can take a look at the error base. We collect all the errors found by checking various open-source projects using PVS-Studio.
You can find a permanent link to a machine-readable map of all analyzer rules in XML format here.
Available only in EAP.
Available only in EAP.
Available only in EAP.
Available only in EAP.