使用aho-corasick算法崩溃?

时间:2012-06-05 06:27:40

标签: c++ algorithm aho-corasick

我在这里获得了aho-corasick算法的代码:http://www.komodia.com/aho-corasick

我用它作为指导说,添加了行并构建了树。

但是我确实将它从使用std wstring更改为std string,但这无关紧要。我只是改变了typedef。

当我使用它并搜索某些内容时,如果没有找到结果则没有问题。当找到结果时,我得到一个std超出范围异常。

它在这里崩溃了:

        if (aIterator==pNode->aMap.end())
            //No, check if we have failure node
            if (!pNode->pFailureNode)
            {
                //No failure node, start at root again
                pNode=&m_aRoot;

                //Reset search string
                sMatchedString="";

                //Did we do a switch?
                if (bSwitch)
                    //We need to do this over
                    --iCount;

                //Exit this loop
                break;
            }
            else
            {
                //What is the depth difference?
                unsigned short usDepth;
                usDepth=pNode->usDepth-pNode->pFailureNode->usDepth-1;

                //This is how many chars to remove
                sMatchedString=sMatchedString.substr(usDepth,sMatchedString.length()-usDepth); //CRASHES HERE!!

                //Go to the failure node
                pNode=pNode->pFailureNode;

                //Set to switch
                bSwitch=true;
            }
        else
        {
            //Add the char
            sMatchedString+=rString[iCount];

            //Save the new node
            pNode=aIterator->second;

            //Exit the loop
            break;
        }
    }

它在这里崩溃了:

sMatchedString=sMatchedString.substr(usDepth,sMatchedString.length()-usDepth); 

以下是变量:

enter image description here

我正在用它在游戏中实施审查。

什么可能导致它崩溃?

我有两次添加一些字符串,这会导致问题吗?

由于

1 个答案:

答案 0 :(得分:1)

一个可能的问题是sMatchedString"u",而usDepth是3.这导致来自第三个字符(在一个字符串中)的子字符串,长度为-2。