簡體   English   中英

為什么調用虛函數修復錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM