ä»åãPVS-StudioããŒã ã¯ãããŸããŸãªãã€ããªãã¡ã€ã«ãåæããŠããããçš®é¡ã®æãããããšãè¡ãããšãã§ãããªããŒã¹ãšã³ãžãã¢ãªã³ã°ã®ããã®å€§ãããŠéªæªãªãã¬ãŒã ã¯ãŒã¯ã§ããGhidraã«é
äºãããŸãããããã«ã€ããŠæãè峿·±ãããšã¯ãããããã©ã°ã€ã³ã§èªç±ã«äœ¿çšãŸãã¯æ¡åŒµã§ãããšããããšã§ã¯ãªããNSAã§äœæããã誰ããGitHubã«æçš¿ããããšã§ããäžæ¹ã§ãNSAã«ã¯ã³ãŒãããŒã¹ãã¯ãªãŒã³ã«ä¿ã€ã®ã«ååãªãªãœãŒã¹ãããããã§ãããããŠããã®äžæ¹ã§ãããŸãç¥ãããŠããªãæ°ããå¯çš¿è
ãæè¿ãæ€åºãããŠããªããã°ã誀ã£ãŠè¿œå ããå¯èœæ§ããããŸãããããã£ãŠãéçåæãæŠåšã«ããã®ãããžã§ã¯ãã®åŒ±ç¹ãæ¢ãããšã«ããŸããããã¬ãªã¥ãŒã
åèšãããšãPVS-Studioéçã¢ãã©ã€ã¶ãŒã¯ãã®ãã©ãããžã§ã¯ãã®Javaéšåã§ã651é«ã904äžãããã³909äœã®èŠåãçºè¡ããŸããïŒãªãªãŒã¹9.1.2ãã³ããã687ce7fïŒããã®äžã§ãé«ããã³äžçšåºŠã®å¿çã®çŽååã¯V6022蚺æã«ãã£ãŠåŒãèµ·ããããŸããããã©ã¡ãŒã¿ã¯ã¡ãœããã®æ¬äœå
ã§ã¯äœ¿çšãããŸãããããã¯éåžžãäžéšã®ãã©ã¡ãŒã¿ãäžèŠã«ãªã£ãããäžéšã®æ©èœãã³ã¡ã³ãã«ãã£ãŠäžæçã«ç¡å¹ã«ããããšãã«ããªãã¡ã¯ã¿ãªã³ã°åŸã«è¡šç€ºãããŸãããããã®èŠåãç°¡åã«ç¢ºèªããŠãã ããïŒèŠåãå€ãããŠããããããå€éšãªãã¶ãŒããšããŠè¡šç€ºããããšãã§ããŸããïŒãã®ãããžã§ã¯ãã§ã¯ãæããã«çããããã®ã¯äœãæããã«ãªããŸããã§ãããããããããã®ãããžã§ã¯ããã¢ãã©ã€ã¶ãŒèšå®ã§ãã®èšºæãäžæçã«ç¡å¹ã«ããŠãæ°ãæ£ããªãããã«ããããšã¯èš±å®¹ãããŸããå®éã«ã¯ãã»ãã¿ãŒãŸãã¯ã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã¡ãŒã¿ãŒã®ååã«ã¿ã€ããã¹ãèŠãããããšããããããŸãã»ãšãã©ã®èªè
ã¯ãå°ãªããšãäžåºŠã¯åæ§ã®äžæå¿«ãªãã¿ãŒã³ã«åºããããŸããpublic class A {
private String value;
public A(String val) {
this.value = value;
}
public int hashCode() {
return value.hashCode();
}
}
äœèŠåã®åå以äžããV6008æœåšçãªã倿°ãã®nulléåç
§ã蚺æã«ãã£ãŠçæãããŸãããããšãã°ãå€File.getParentFileïŒïŒã¯nullããã§ãã¯ããã«äœ¿çšãããããšããããããŸãããã®ã¡ãœãããåŒã³åºããããã¡ã€ã«ãªããžã§ã¯ãã絶察ãã¹ãªãã§äœæãããå Žåãnullãè¿ãããæ€èšŒãè¡ãããªããšã¢ããªã±ãŒã·ã§ã³ãåé€ãããå¯èœæ§ããããŸããäŒçµ±çã«ãé«ã¬ãã«ãšäžã¬ãã«ã®èŠåã®ã¿ãåæããŸããããã¯ãå®éã®ãšã©ãŒã®å€§éšåãå«ãŸããŠããããã§ããã¢ãã©ã€ã¶ãŒã¬ããŒãã䜿çšããå Žåã¯ãä¿¡é Œæ§ã®é«ãé ã«èŠåãåæããããšããå§ãããŸããæ¬¡ã«ãã¢ãã©ã€ã¶ãŒã«ãã£ãŠç€ºããããçããããŸãã¯è峿·±ããšæãããããã€ãã®ãã©ã°ã¡ã³ããæ€èšããŸãããããžã§ã¯ãã®ã³ãŒãããŒã¹ã¯å°è±¡çãªãµã€ãºã§ããããšã倿ãããã®ãããªå Žæãæåã§èŠã€ããããšã¯ã»ãšãã©äžå¯èœã§ãããã©ã°ã¡ã³ã1ïŒç¡å¹ãªæ€èšŒ
private boolean parseDataTypeTextEntry()
throws InvalidDataTypeException {
...
try {
newDataType = parser.parse(selectionField.getText(),
getDataTypeRootForCurrentText());
}
catch (CancelledException e) {
return false;
}
if (newDataType != null) {
if (maxSize >= 0
&& newDataType.getLength() > newDataType.getLength()) {
throw new InvalidDataTypeException("data-type larger than "
+ maxSize + " bytes");
}
selectionField.setSelectedValue(newDataType);
return true;
}
return false;
}
PVS-StudioèŠåïŒV6001ã>ãæŒç®åã®å·ŠåŽãšå³åŽã«åããµãåŒãnewDataType.getLengthïŒïŒãããããŸãã DataTypeSelectionEditor.java data66ãã®ã¯ã©ã¹ã¯ããªãŒãã³ã³ããªãŒãããµããŒãããããŒã¿åãéžæããããã®ã°ã©ãã£ã«ã«ã³ã³ããŒãã³ããæäŸããŸãããã®ã³ã³ããŒãã³ãã䜿çšããéçºè
ã¯ãéžæãããããŒã¿åã®æå€§èš±å®¹ãµã€ãºãïŒmaxSizeãã£ãŒã«ããä»ããŠïŒèšå®ããããè² ã®å€ãèšå®ããããšã§ç¡å¶éã«ããããšãã§ããŸããå
¥åãããããŒã¿ãæ€èšŒãããšããå¶éãè¶
ãããšäŸå€ãã¹ããŒããããããã³ãŒã«ã¹ã¿ãã¯ã«è¿œãã€ãããŠãŒã¶ãŒã«ã¡ãã»ãŒãžã衚瀺ããããšæ³å®ãããŠããŸãããã³ã³ããŒãã³ãã®äœæè
ã¯ããã®ãã¹ããæžããŠããæç¹ã§æ°ãæ£ã£ãŠããããã§ãããããã¯ãããã圌ã¯äººçã®æå³ã«ã€ããŠèããŠããŸããããæçµçã«ã¯æ€èšŒãå®è¡ãããŸãããæ°ãããèªäœãã倧ãããªãããšã¯ãªãããããã®æ¡ä»¶ã¯ç¡èŠãããŸããã€ãŸãããã®ã³ã³ããŒãã³ãã¯ç¡å¹ãªããŒã¿ãæäŸããå¯èœæ§ããããŸããå¥ã®åæ§ã®ãšã©ãŒãããã«2ã€ã®ã¯ã©ã¹ã§èŠã€ãããŸããïŒGuidUtilãšNewGuidãpublic class GuidUtil {
...
public static GuidInfo parseLine(...) {
...
long[] data = new long[4];
...
if (isOK(data)) {
if (!hasVersion) {
return new GuidInfo(guidString, name, guidType);
}
return new VersionedGuidInfo(guidString, version, name, guidType);
}
return null;
}
...
private static boolean isOK(long[] data) {
for (int i = 0; i < data.length; i++) {
if ((data[i] != 0) || (data[i] != 0xFFFFFFFFL)) {
return true;
}
}
return false;
}
...
}
PVS-Studio èŠåïŒV6007åŒ 'data [i]ïŒ= 0xFFFFFFFFL'ã¯åžžã«trueã§ãã GuidUtil.java:200ã¶çšã®ã«ãŒãISOKã®æ¹æ³ã®åãå€ãåæã«2ã€ã®ç°ãªãçªå·ã«çãããªãããšããã§ãã¯ããŸãããã®å ŽåãGUIDã¯ããã«æå¹ã§ãããšèªèãããŸããã€ãŸããGUIDã¯ãããŒã¿é
åã空ã®å Žåã«ã®ã¿ç¡å¹ã«ãªããŸããããã¯ã察å¿ãã倿°ã®å€ãparseLineã¡ãœããã®æåã«1åã ãå²ãåœãŠããããããçºçããŸãããIsOKã¡ãœããæ¬äœäž¡æ¹ã®ã¯ã©ã¹ã§å®å
šã«äžèŽããŠããŸããããã¯ãééã£ãã³ãŒãã®å¥ã®ã³ããŒãšè²Œãä»ãã®ã¢ã€ãã¢ã瀺åããŠããŸããèè
ãæ£ç¢ºã«ç¢ºèªãããã£ãããšã¯ããããŸãããããã®ã¡ãœããã¯æ¬¡ã®ããã«ä¿®æ£ããå¿
èŠããããšèããããŸããprivate static boolean isOK(long[] data) {
for (int i = 0; i < data.length; i++) {
if ((data[i] == 0) || (data[i] == 0xFFFFFFFFL)) {
return false;
}
}
return true;
}
ãã©ã°ã¡ã³ã2ïŒäŸå€ãé ã
public void putByte(long offsetInMemBlock, byte b)
throws MemoryAccessException, IOException {
long offsetInSubBlock = offsetInMemBlock - subBlockOffset;
try {
if (ioPending) {
new MemoryAccessException("Cyclic Access");
}
ioPending = true;
doPutByte(mappedAddress.addNoWrap(offsetInSubBlock / 8),
(int) (offsetInSubBlock % 8), b);
}
catch (AddressOverflowException e) {
new MemoryAccessException("No memory at address");
}
finally {
ioPending = false;
}
}
PVS-StudioèŠåïŒV6006ãªããžã§ã¯ãã¯äœæãããŸãããã䜿çšãããŠããŸããã ãthrowãããŒã¯ãŒããæ¬ èœããŠããå¯èœæ§ããããŸãïŒãnew MemoryAccessExceptionïŒ "Cyclic Access"ïŒãã BitMappedSubMemoryBlock.java:99äŸå€ãªããžã§ã¯ãèªäœã¯ããåãã®ãšãããäœãããŸããïŒãŸãã¯ãå°ãªããšãäœããã¹ãã§ã¯ãããŸããïŒãã»ãšãã©ã®å Žåããããã®æ°ããã€ã³ã¹ã¿ã³ã¹ã¯ã¹ããŒãéããŠã¹ããŒãããŸããããŸãã«ãã©ããã«è»¢éãããããã³ã¬ã¯ã·ã§ã³ã«é
眮ãããå ŽåããããŸãããã®ã¡ãœãããå«ãã¯ã©ã¹ã¯ãããŒã¿ã®èªã¿åããšæžã蟌ã¿ãå¯èœã«ããã¡ã¢ãªãããã¯ã®ã©ãããŒã§ããããã§ã¯ãäŸå€ãã¹ããŒãããªããããioPendingãã©ã°ã䜿çšããŠçŸåšã®ã¡ã¢ãªãããã¯ãžã®ã¢ã¯ã»ã¹ã«èª²ããããå¶éã«éåããå¯èœæ§ããããŸãããã«ãAddressOverflowExceptionã¯ç¡èŠãããŸãããããã£ãŠãããŒã¿ã¯éãã«ç Žæããå¯èœæ§ããããç¹å®ã®å Žæã§ãšã©ãŒãæç€ºçã«ç€ºã代ããã«ãéçºè
ã¯ãããã¬ãŒã§åæããå¿
èŠã®ããå¥åŠãªã¢ãŒãã£ãã¡ã¯ããåãåããŸãããããã®å€±ãããäŸå€ã¯8ã€ãããŸããã- BitMappedSubMemoryBlock.javaïŒ77ã99ã106ã122è¡ç®
- ByteMappedSubMemoryBlock.javaïŒ52ã73ã92ã114è¡ç®
åããã¡ã€ã«å
ã«ãthrowãååšããéåžžã«é¡äŒŒããã¡ãœãããããã®ãç¹åŸŽã§ããã»ãšãã©ã®å Žåã1ã€ã®ã¡ãœããã¯äžèšã®ãã©ã°ã¡ã³ããšåæ§ã«æåã«èšè¿°ãããåŸãæ°åã³ããŒãããäœããã®çç±ã§ãšã©ãŒãèŠã€ãããèŠããŠããå Žæã§ä¿®æ£ãããŸããããã©ã°ã¡ã³ã3ïŒå°é·å
private void processSelection(OptionsTreeNode selectedNode) {
if (selectedNode == null) {
setViewPanel(defaultPanel, selectedNode);
return;
}
...
}
private void setViewPanel(JComponent component, OptionsTreeNode selectedNode) {
...
setHelpLocation(component, selectedNode);
...
}
private void setHelpLocation(JComponent component, OptionsTreeNode node) {
Options options = node.getOptions();
...
}
PVS-Studioã®èŠåïŒV6008颿°ãsetViewPanelãã®ãselectedNodeãã®nulléåç
§ã OptionsPanel.java:266ã¢ãã©ã€ã¶ãŒã¯å°ãåãã€ããŸãã-çŸæç¹ã§ã¯ãprocessSelectionã¡ãœãããåŒã³åºããŠãNullPointerExceptionã¯çºçããŸããããã®ã¡ãœãããåŒã³åºãããã®ã¯2åã ãã§ããããããåŒã³åºãåã«ãselectedNodeãæç€ºçã«nullã«ã€ããŠãã§ãã¯ãããŠããããã§ããå¥ã®éçºè
ã¯ã¡ãœãããselectedNode == nullã®ã±ãŒã¹ãæç€ºçã«åŠçãããããæå¹ãªå€ã§ãããšå€æããŠã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããå¯èœæ§ãããããããããè¡ãã¹ãã§ã¯ãããŸãããã³ãŒãããŒã¹ãç¥ããªã人ã培åºçã«åå ããŠãããããç¹ã«å±éºãªã®ã¯ãªãŒãã³ãããžã§ã¯ãã ãã®ãããªé©ãã§ããäžè¬çã«ãprocessSelectionã¡ãœããå
šäœã¯ããªãå¥åŠã«èŠããŸããåãã¡ãœããã§ãæ¡ä»¶ã¯ç°ãªããŸããåãããã£ã®ifãããã¯ã2åä»¥äžæ€åºããããããããã¯ã³ããŒãšè²Œãä»ãã®ãšã©ãŒã§ããå¯èœæ§ããããŸãããã ãããã®æç¹ã§ã¯ãselectedNodeã¯nullã§ãªããªããsetViewPanel-setHelpLocationåŒã³åºããã§ãŒã³ã¯NullPointerExceptionãåŒãèµ·ãããŸããããã©ã°ã¡ã³ã4ïŒæªã®èªåè£å®
public static final int[] UNSUPPORTED_OPCODES_LIST = { ... };
public static final Set<Integer> UNSUPPORTED_OPCODES = new HashSet<>();
static {
for (int opcode : UNSUPPORTED_OPCODES) {
UNSUPPORTED_OPCODES.add(opcode);
}
}
PVS-StudioèŠåïŒV6053å埩ã®é²è¡äžã«ã³ã¬ã¯ã·ã§ã³ã倿ŽãããŸããã ConcurrentModificationExceptionãçºçããå ŽåããããŸãã DWARFExpressionOpCodes.java:205ãã®å Žåãã¢ãã©ã€ã¶ã¯åã³å°ãåãã€ããŸãããUNSUPPORTED_OPCODES ã³ã¬ã¯ã·ã§ã³ã¯åžžã«ç©ºã§ãããã«ãŒãã¯å®è¡ãããªããããäŸå€ã¯ã¹ããŒãããŸãããããã«ãããŸããŸã³ã¬ã¯ã·ã§ã³ã倿°ã§ããããã§ã«ååšããèŠçŽ ã远å ããŠã倿ŽãããŸããããããããèè
ã¯for-eachãªãŒãã³ã³ããªãŒãã«ããã³ã¬ã¯ã·ã§ã³ã®ååãééã£ããã£ãŒã«ããææ¡ãããããšã«æ°ã¥ããªãã£ããå埩äžã«ã³ã¬ã¯ã·ã§ã³ã倿Žããããšã¯äžå¯èœã§ããããã®å Žåã®ããã«ãã¢ããªã±ãŒã·ã§ã³ãé©åã«åäœããªãå ŽåããããŸããããã§ããã®ã¿ã€ããã¹ã«ã¯éæ¥çãªåœ±é¿ããããŸããDWARFãã¡ã€ã«ãè§£æãããã·ã³ã¯ããã®ã³ã¬ã¯ã·ã§ã³ã«äŸåããŠããµããŒããããŠããªããªãã³ãŒããèŠã€ãããšåæã忢ããŸããJava 9以éã宿°ã³ã¬ã¯ã·ã§ã³ã®æšæºã©ã€ãã©ãªã®ãã¡ã¯ããªã¡ãœããã䜿çšãã䟡å€ããããŸããããšãã°ãSet.ofïŒT ...èŠçŽ ïŒã¯ã¯ããã«äŸ¿å©ã§ããã ãã§ãªããäœæãããã³ã¬ã¯ã·ã§ã³ãããã«äžå€ã«ããŠãã³ãŒãã®ä¿¡é Œæ§ãé«ããŸãããã©ã°ã¡ã³ã5ïŒãã¹ãŠããããŸã
public void setValueAt(Object aValue, int row, int column) {
...
int index = indexOf(newName);
if (index >= 0) {
Window window = tool.getActiveWindow();
Msg.showInfo(getClass(), window, "Duplicate Name",
"Name already exists: " + newName);
return;
}
ExternalPath path = paths.get(row);
...
}
private int indexOf(String name) {
for (int i = 0; i < paths.size(); i++) {
ExternalPath path = paths.get(i);
if (path.getName().equals(name)) {
return i;
}
}
return 0;
}
PVS-Studioã®èŠåïŒ- V6007åŒ 'index> = 0'ã¯åžžã«trueã§ããExternalNamesTableModel.java:105
- V6019 Unreachable code detected. It is possible that an error is present. ExternalNamesTableModel.java:109
èè
ã¯ããã«ã€ããŠèããindexOfã¡ãœããã§ã¯ã "index"ã®ä»£ããã«ãäžæãªå€ã«å¯ŸããŠ-1ã¯0- ãã¹ã³ã¬ã¯ã·ã§ã³ã®æåã®èŠçŽ ã®ã€ã³ããã¯ã¹ãè¿ããŸããã³ã¬ã¯ã·ã§ã³ã空ã§ãã£ãŠãããŸãã¯ãã¡ãœãããçæããããã®ã®ãããã©ã«ãã®æ»ãå€ã倿Žããã®ãå¿ããŠããŸããããã®çµæãæ¢åã®ååããªãå Žåã§ããsetValueAtã¡ãœããã¯æž¡ãããå€ãç Žæ£ãããååã¯æ¢ã«ååšããŸãããšã©ãŒã§ãŠãŒã¶ãŒã衚瀺ããŸããã¡ãªã¿ã«ãindexOfã¯ä»ã§ã¯äœ¿çšãããŠãããããã®å€ã¯ãæ¢ããŠããèŠçŽ ãååšãããã©ããã倿ããããã«ã®ã¿å¿
èŠã§ãããããããåå¥ã®ã¡ãœããã®ä»£ããã«ãset - ValueAtã«for-eachãçŽæ¥èšè¿°ããŠãreturnããŸããã€ã³ããã¯ã¹ä»ãã®ã²ãŒã ã§ã¯ãªããäžèŽããã¢ã€ãã ã§ã泚ïŒç³ãç«ãŠããããšã©ãŒãåçŸã§ããŸããã§ãããsetValueAtã¡ãœããã¯ãããã䜿çšãããªãããç¹å®ã®æ¡ä»¶äžã§ã®ã¿åŒã³åºãããŸãããã©ã°ã¡ã³ã6ïŒæ²é»ãå®ã
final static Map<Character, String> DELIMITER_NAME_MAP = new HashMap<>(20);
static {
DELIMITER_NAME_MAP.put(' ', "Space");
DELIMITER_NAME_MAP.put('~', "Tilde");
DELIMITER_NAME_MAP.put('`', "Back quote");
DELIMITER_NAME_MAP.put('@', "Exclamation point");
DELIMITER_NAME_MAP.put('@', "At sign");
DELIMITER_NAME_MAP.put('#', "Pound sign");
DELIMITER_NAME_MAP.put('$', "Dollar sign");
DELIMITER_NAME_MAP.put('%', "Percent sign");
...
}
PVS-StudioèŠåïŒV6033åãããŒã@ãã®ã¢ã€ãã ã¯ãã§ã«è¿œå ãããŠããŸãã FilterOptions.java:45 Ghidraã¯ãããŸããŸãªã³ã³ããã¹ãã§ã®ããŒã¿ã®ãã£ã«ã¿ãªã³ã°ããµããŒãããŠããŸããããšãã°ããããžã§ã¯ããã¡ã€ã«ã®ãªã¹ããååã§ãã£ã«ã¿ãªã³ã°ã§ããŸããããã«ãäžåºŠã«è€æ°ã®ããŒã¯ãŒãã«ãããã£ã«ã¿ãªã³ã°ãå®è£
ãããŠããŸãããORãã¢ãŒãããªã³ã®å Žåãããjavaã.cãã¯ãååã«ã.javaããŸãã¯ã.cãã®ãããããå«ããã¹ãŠã®ãã¡ã€ã«ã衚瀺ããŸããåèªã®åºåãæåãšããŠç¹æ®æåã䜿çšã§ããããšã¯çè§£ãããŠããŸããïŒç¹å®ã®åºåãæåã¯ãã£ã«ã¿ãŒèšå®ã§éžæãããŠããŸãïŒãå®éã«ã¯æå笊ã¯äœ¿çšã§ããŸããã§ããããã®ãããªåæåã·ãŒãã§ã¯ãã³ããŒãšè²Œãä»ãã䜿çšããŠèšè¿°ãããããšãå€ãããã®ãããªã³ãŒããèŠããšç®ãããã«ãŒãããŸãããããŠãã¿ã€ããã¹ã2ã€ã®é£æ¥ããè¡ã«ãªãã£ãå Žåã¯ãæäœæ¥ã§ã¯ã»ãšãã©ééããªã誰ãèŠãªããªããŸãããã©ã°ã¡ã³ã7ïŒé€ç®ã®æ®ãã¯åžžã«0
void setFactorys(FieldFactory[] fieldFactorys,
DataFormatModel dataModel, int margin) {
factorys = new FieldFactory[fieldFactorys.length];
int x = margin;
int defaultGroupSizeSpace = 1;
for (int i = 0; i < factorys.length; i++) {
factorys[i] = fieldFactorys[i];
factorys[i].setStartX(x);
x += factorys[i].getWidth();
if (((i + 1) % defaultGroupSizeSpace) == 0) {
x += margin * dataModel.getUnitDelimiterSize();
}
}
width = x - margin * dataModel.getUnitDelimiterSize() + margin;
layoutChanged();
}
PVS-Studioã®èŠåïŒ- V6007åŒ 'ïŒïŒi + 1ïŒïŒ
defaultGroupSizeSpaceïŒ== 0'ã¯åžžã«trueã§ããByteViewerLayoutModel.java:66
- V6048ãã®åŒã¯ç°¡ç¥åã§ããŸããæäœã®ãªãã©ã³ããdefaultGroupSizeSpaceãã¯1ã§ããByteViewerLayoutModel.java:66
16é²ãã€ããã¥ãŒã¢ã¯ã衚瀺ãããã°ã«ãŒãã®ãµã€ãºã®éžæããµããŒãããŸããããšãã°ãåºåããffff ffffããŸãã¯ãff ff ff ffãã®åœ¢åŒã§æ§æã§ããŸããsetFactorysã¡ãœããã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã§ã®ãããã®ã°ã«ãŒãã®å Žæã管çããŸããã«ã¹ã¿ãã€ãºãšè¡šç€ºãæ£ããæ©èœãããšããäºå®ã«ããããããããã®æ¹æ³ã®ãµã€ã¯ã«ã¯éåžžã«çãããèŠããŸãã1ã«ããé€ç®ã®æ®ãã¯åžžã«0ã§ãããããã¯åå埩ã§x座æšãå¢å ããããšãæå³ããŸãã Suspicionã¯ãDataModelã®èšå®ã«ããããã£ãšå¯çšæ§groupSizeã远å ããŸãã
ãªãã¡ã¯ã¿ãªã³ã°åŸã«æ®ã£ããŽãïŒãŸãã¯ãdefaultGroupSizeSpace倿°ã®èšç®ã倱ãããå¯èœæ§ããããŸãïŒãããã®å Žåã§ãããã®å€ãdataModel.getGroupSizeïŒïŒã§çœ®ãæããããšãããšã¬ã€ã¢ãŠããå£ãããããããã®ã³ãŒãã®äœæè
ã ããæç¢ºãªçããåºãããšãã§ããŸãããã©ã°ã¡ã³ã8ïŒæ€èšŒã®å€±æãããŒã2
private String parseArrayDimensions(String datatype,
List<Integer> arrayDimensions) {
String dataTypeName = datatype;
boolean zeroLengthArray = false;
while (dataTypeName.endsWith("]")) {
if (zeroLengthArray) {
return null;
}
int rBracketPos = dataTypeName.lastIndexOf(']');
int lBracketPos = dataTypeName.lastIndexOf('[');
if (lBracketPos < 0) {
return null;
}
int dimension;
try {
dimension = Integer.parseInt(dataTypeName.substring(lBracketPos + 1,
rBracketPos));
if (dimension < 0) {
return null;
}
}
catch (NumberFormatException e) {
return null;
}
dataTypeName = dataTypeName.substring(0, lBracketPos).trim();
arrayDimensions.add(dimension);
}
return dataTypeName;
}
PVS-StudioèŠåïŒV6007åŒãzeroLengthArrayãã¯åžžã«falseã§ãã PdbDataTypeParser.java:278ãã®ã¡ãœããã¯ã倿¬¡å
é
åã®æ¬¡å
ãè§£æããè§£æåŸã«æ®ã£ãŠããããã¹ãããŸãã¯ç¡å¹ãªããŒã¿ã®å Žåã¯nullãè¿ããŸããæ€èšŒãã§ãã¯ã®ããããã®é£ã®ã³ã¡ã³ãã¯ãæåŸã®èªã¿åããµã€ãºã®ã¿ããŒãã«ãªãããšãã§ããããšã瀺ããŠããŸããåæã¯å³ããå·Šã«é²ããããã[0] [1] [2]ãã¯æå¹ãªå
¥åããã¹ãã§ãããã[2] [1] [0]ãã¯æå¹ã§ã¯ãªãããšãããããŸããããããåé¡ã¯æ¬¡ã®ãµã€ãºããŒãã§ãããšãããã§ãã¯ã誰ã远å ããªãã£ããããããŒãµãŒã¯äžèŠãªè³ªåãªãã«ç¡å¹ãªããŒã¿ãé£ã¹ãŠããŸããŸãããããããæ¬¡ã®ããã«tryãããã¯ãä¿®æ£ããå¿
èŠããããŸããtry {
dimension = Integer.parseInt(dataTypeName.substring(lBracketPos + 1,
rBracketPos));
if (dimension < 0) {
return null;
} else if (dimension == 0) {
zeroLengthArray = true;
}
}
catch (NumberFormatException e) {
return null;
}
åœç¶ã®ããšãªããããã®æå¹æ§ã®åºæºã¯æéã®çµéã«äŒŽã£ãŠäžèŠã«ãªãå¯èœæ§ããããŸãããŸãã¯ãèè
ã®ã³ã¡ã³ãã®æå³ãç°ãªããæåã«èªãã æ¬¡å
ã確èªããå¿
èŠããããŸãããããã®å Žåã§ããããŒã¿ã®æ€èšŒã¯ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã®éèŠãªéšåã§ããããã¹ãŠã®è²¬ä»»ãè² ãå¿
èŠããããŸãããšã©ãŒãçºçãããšãã¢ããªã±ãŒã·ã§ã³ã®éåžžã«ç¡å®³ãªã¯ã©ãã·ã¥ã®ã»ããã»ãã¥ãªãã£ããŒã«ãããŒã¿ã®æŒæŽ©ãããŒã¿ã®ç ŽæãŸãã¯æå€±ã«ã€ãªããå¯èœæ§ããããŸãïŒããšãã°ãã¯ãšãªæ€èšŒäžã«SQLã€ã³ãžã§ã¯ã·ã§ã³ãã¹ãããããå ŽåïŒãæ®ãã®èŠåã«ã€ããŠå°ã
èªè
ã¯å€ãã®èŠåãåºãããããšã«æ°ã¥ããããããŸããããããã€ãã¯èæ
®ãããŸããã§ããããããžã§ã¯ãã§ããŸããããã«èª¿æŽãããŠããªãclocã¯ãçŽ125äžè¡ã®Javaã³ãŒããã«ãŠã³ãããŸããïŒç©ºã§ãã³ã¡ã³ãã§ããªãïŒãå®éãã»ãšãã©ãã¹ãŠã®èŠåã¯éåžžã«ãã䌌ãŠããŸããããã§ã¯ãnullã確èªããã®ãå¿ããŠãããæªäœ¿çšã®ã¬ã¬ã·ãŒã³ãŒããåé€ããŠããŸãããåãããšãæããŠèªè
ã飜ããããããªãã®ã§ãèšäºã®åé ã§ãã®ãããªã±ãŒã¹ã®äžéšã«ã€ããŠè¿°ã¹ãŸãããå¥ã®äŸã¯ããµãã¹ããªã³ã°ã¡ãœããã®äžæ£ç¢ºãªäœ¿çšã®ã³ã³ããã¹ãã§ã®50ã®èŠåãV6009颿°ã奿°ã®åŒæ°ãåãåããŸããã§ããïŒCParserUtils.java:280ãComplexName.java:48ãªã©ïŒã䜿çšããŠãåºåãæåã®åŸã®æ®ãã®æååãååŸããŸããå€ãã®å Žåãéçºè
ã¯ãã®ã»ãã¬ãŒã¿ãŒãæååã«ååšããããšãæã¿ãããã§ãªãå Žåã¯indexOfã-1ãè¿ãããšãå¿ããŸããããã¯substringã®äžæ£ãªå€ã§ããåœç¶ãããŒã¿ãå€éšããã§ã¯ãªãæ€èšŒãŸãã¯åä¿¡ãããå Žåãã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããå¯èœæ§ã¯å€§å¹
ã«æžå°ããŸãããã ããäžè¬çã«ããããã¯ç§ãã¡ãåãé€ãã®ãæå©ããããæœåšçã«å±éºãªå Žæã§ããçµè«
äžè¬çã«ãã®ãã©ã¯ã³ãŒãã®åè³ªã«æºè¶³ããŠããŸã-ç¹å¥ãªæªå€¢ã¯æçœã§ã¯ãããŸãããã³ãŒãã¯é©åã«ãã©ãŒããããããŠãããéåžžã«äžè²«ããã¹ã¿ã€ã«ãæã£ãŠããŸããã»ãšãã©ã®å Žåã倿°ãã¡ãœããããã®ä»ãã¹ãŠã«æç¢ºãªååãä»ãããã説æã³ã¡ã³ããèŠã€ããã倿°ã®ãã¹ããååšããŸããåœç¶ãåé¡ã¯ãããŸããã§ããã- ã»ãšãã©ã®å Žåã倿°ã®ãªãã¡ã¯ã¿ãªã³ã°åŸã«æ®ã£ããããã³ãŒãã
- å€ãã®javadocã¯çµ¶æçã«å€ããªã£ãŠãããããšãã°ãååšããªããã©ã¡ãŒã¿ã瀺ããŠããŸãã
- IntelliJ IDEAã䜿çšããå Žåã䟿å©ãªéçºã®å¯èœæ§ã¯ãããŸããã
- ãªãã¬ã¯ã·ã§ã³ãäžå¿ã«æ§ç¯ãããã¢ãžã¥ã©ãŒã·ã¹ãã ã¯ããããžã§ã¯ãã®ããã²ãŒããšã³ã³ããŒãã³ãéã®äŸåé¢ä¿ã®æ€åºãã¯ããã«å°é£ã«ããŸãã
éçºè
ããŒã«ãããããã«ããªãã§ãã ãããã·ãŒããã«ãã®ãããªéçåæã¯äžèœè¬ã§ã¯ãããŸãããããªãªãŒã¹åã«ããã€ãã®çœå®³ãé²ãã®ã«åœ¹ç«ã¡ãŸãããŸãããã°ã€ã³ãããœãããŠã§ã¢ã䜿ããããªã人ãããŸããããªãã¯ç§ãã¡ã®ããã°ã§ä»ã®èšŒæããããããžã§ã¯ãã«ã€ããŠèªãããšãã§ããŸãããŸãã詊çšçã©ã€ã»ã³ã¹ãšãã¢ãã©ã€ã¶ãŒã䜿çšããããã«æ¯æãå¿
èŠã®ãªãããŸããŸãªãªãã·ã§ã³ããããŸãã
ãã®èšäºãè±èªã話ãèŠèŽè
ãšå
±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒNikita LazebaãNSAãã®ãã©ããŠãã³ãŒã³ã