小编use*_*119的帖子

我们如何解释静态代码分析中的异常抛出?

我编写了一个实用程序来为java方法创建一个CFG(控制流图),该方法的节点是基本块而不是指令.

我不能认为异常抛出是CFG中的边缘.原因是:

  1. try块中的每条指令都可能抛出可由任何嵌套try-catch块处理的异常/错误.如果我们将异常抛出视为边缘,则处理的路径数量会急剧增加,CFG中的节点数也会增加.
  2. 在我们决定可能的跳转之前,我们需要知道异常的继承层次结构.

静态代码分析器如何解决这个问题?

我被困在这一点上.如果我必须继续,我应该怎么做呢?

编辑:在我的情况下,我可以限制对那些可以指定抛出位置和异常的用例的支持.这解决了我的第二个问题.我仍然想知道通用静态代码分析器如何管理它.

java decompiler

7
推荐指数
1
解决办法
104
查看次数

我们如何在 Swift 中实现等待/通知

在Java中,我们可以这样做:

synchronized(a) {
    while(condition == false) {
        a.wait(time);
    }
    //critical section ...
    //do something
}
Run Code Online (Sandbox Code Playgroud)

上面是一个条件同步块,它等待条件成功才能执行关键部分。

当执行 a.wait 时(例如 100 毫秒),线程在该持续时间内退出临界区,并且由对象 a 执行同步的其他一些临界区,这使得条件为真。

当条件成功时,当前线程下次进入临界区并评估条件时,循环退出并执行代码。

需要注意的要点: 1. 多个临界区由同一个对象同步。2. 线程仅在等待期间不处于临界区。一旦wait出来,线程又回到临界区。

下面是在 Swift 4 中使用 DispatchSemaphore 执行相同操作的正确方法吗?

while condition == false {
    semaphore1.wait(duration)
}
semaphore1.wait()
//execute critical section
semaphore1.signal()
Run Code Online (Sandbox Code Playgroud)

当我们进入临界区时,条件可能会被修改。

因此,我们可能必须执行如下操作才能实现 Java 行为。在 Swift 中是否有更简单的方法来做到这一点?

while true {
    //lock
    if condition == false {
        //unlock
        //sleep for sometime to prevent frequent polling
        continue
    } else {
        //execute critical section
        //...
        //unlock
        break
    } …
Run Code Online (Sandbox Code Playgroud)

multithreading synchronization swift

7
推荐指数
2
解决办法
3276
查看次数