[英]Why would calling a dummy function fix a bug?
我正在開發一個涉及邏輯電路仿真的項目(Java 8)。 這些電路在我用ANTLR v4解析的輸入文件中描述。
使用ANTLR的訪問者類,我構建了一個Composite結構,它存儲了模擬電路所需的所有組件。
// module is an ANTLR parse tree
BLXCircuit mainCircuit = modelGenerator.visit(module);
之后,我將此電路的輸入初始化為用戶指定的任何內容,但為簡單起見,我將它們初始化為false(假設有3個輸入):
Map<BLXSocket, Boolean> valueMap = new HashMap<>();
List<BLXSocket> inputs = mainCircuit.getInputSockets();
valueMap.put(inputs.get(0), false);
valueMap.put(inputs.get(1), false);
valueMap.put(inputs.get(2), false);
然后我啟動評估者:
BLXEventManager eventManager = new BLXEventManager(valueMap, 500);
eventManager.start();
所有這些在Mac OS X上完美運行,但是當我在Windows或Linux上運行它時,評估只是......通過返回不正確的值而無聲地失敗。 程序優雅地退出,輸出錯誤的計算。
但是,這是我的問題,如果我定義函數:
private static void noAction(BLXSignalReceiver unused) { }
private static void whyDoesThisFixThings(BLXCircuit blxCircuit) {
for (BLXSocket blxSocket : blxCircuit.getInputSockets()) {
blxSocket.getTargets().forEach(Main::noAction);
}
}
在聲明mainCircuit
之后添加對此函數的mainCircuit
:
BLXCircuit mainCircuit = modelGenerator.visit(module);
whyDoesThisFixThings(mainCircuit); // why??
那么Windows和Linux都會表現出正確的行為。 為什么這可能是?
編輯 :我還發現這個代碼在調試器下的運行方式與其自身不同(不是更好,必然)。
更新 :我重寫了在Java 7上運行的所有代碼,而沒有改變它的語義。 它現在可以在JDK 7上正常運行。在Java 8上運行時完全相同的代碼也會失敗。
更新2 :之前我錯了。 現在看來程序只能在慢速機器上正常運行。 它可以在調試器或Macbook Air上運行,與我的開發平台中的Core i7相比,它的處理器速度較慢。 這必須是一個非常競爭的條件。
好的,感謝評論中的所有幫助。 最終,這是我們的評估模型中的“競爭條件”(程序是單線程的)。 我們使用優先級隊列而沒有正確檢查重復的沖突條目。 例如,沖突信號有可能在未定義的時間發送到同一邏輯門。
這可能是我在編寫Java代碼時遇到的最奇怪的錯誤,至少就它如何呈現而言。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.