小编irs*_*sis的帖子

如何确定字符串是否是字符串列表的串联

假设我们给出了一个字符串S,以及一些其他字符串L的列表.

我们怎么知道S是否是L的所有可能连接中的一个?

例如:

S ="abcdabce"

L = ["abcd","a","bc","e"]

S是"abcd"+"a"+"bc"+"e",则S是L的串联,而"ababcecd"则不是.

为了解决这个问题,我尝试使用DFS /回溯.伪代码如下:

boolean isConcatenation(S, L) {
    if (L.length == 1 && S == L[0]) return true;
    for (String s: L) {
        if (S.startwith(s)) {
            markAsVisited(s);
            if (isConcatnation(S.exclude(s), L.exclude(s))) 
                return true;
            markAsUnvisited(s);
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

但是,DFS /回溯不是一种有效的解决方案.我很好奇什么是解决这个问题的最快算法,或者是否有任何其他算法以更快的方式解决它.我希望有像KMP这样的算法可以在O(n)时间内解决它.

string algorithm

6
推荐指数
1
解决办法
1994
查看次数

COM(C++)Interlock API是否足以支持AddRef和Release中的Thread Saftey?

我知道在COM对象的AddRef和Release方法内部使用了互锁API来增加/减少引用计数线程的安全性.但我试图理解这里是使用Interlock API还是我们需要某种其他同步对象,例如Mutex.到目前为止,我见过的所有示例代码都只使用了Interlock API.

场景 - 假设我已经实现了消息对象的AddRef和Release方法,如下所示.假设线程A访问消息对象,因此m_lRef count为1.一旦完成消息对象使用线程A调用Release方法

内部释放方法 - 第9行 - m_lRef = 1第10行 - m_lRef = 0,lRef = 0

线程A在第10行暂停,另一个线程B访问相同的消息,因此它调用AddRef方法,该方法将第3行的m_lRef值设置为1.现在,线程B被挂起,线程A在第11行恢复 - m_lRef = 1,lRef = 0.线程A将删除该对象.现在,如果线程B试图访问同一个对象; 崩溃是不可避免的.

我的问题 - 我的情况有效吗?如果m_lRef = 1则理想情况下没有其他线程应该等待访问该对象.但是为了防止在这种意外情况下发生崩溃,我们不应该用互斥锁或CS保护整个释放方法吗?

1. STDMETHODIMP_(ULONG) CMapiMsg::AddRef()
2. {
3.   LONG lRef = InterlockedIncrement(&m_lRef);
4.   return lRef;
5. }
6.  
7. STDMETHODIMP_(ULONG) CMapiMsg::Release()
8. {
9.    LONG lRef = InterlockedDecrement(&m_lRef);
10.   if(0 == lRef)
11.   {
12.    delete this;
13.   }
14.   return lRef;
15. }
Run Code Online (Sandbox Code Playgroud)

参考计数规则

c++ windows com mapi winapi

5
推荐指数
1
解决办法
909
查看次数

如果路径包含符号链接,Windows API 将获取文件属性?

我使用_stat64(const char *path, struct __stat64 *buffer);API 来获取文件/目录统计信息,但如果输入路径包含符号链接,则此 API 会失败。

GetFileAttributes()GetFileAttributesEx()如果文件路径包含符号链接,API 也会失败。但正如MSDN 所述,如果路径指向符号链接,则这两个函数返回符号链接的属性。即使_stat64()路径指向符号链接也有效。

如果路径包含[不指向]符号链接,有没有办法获取文件/目录的状态/属性?

例如 -如果输入路径是“D:\temp\ symbolic_link \test”,如何获取“ test ”目录的属性

[Edit1] 由于 eryksun 的评论是有道理的。我再次尝试了 GetFileAttributesEx() 和 _stat64()。它起作用了,但这次我授予了目标目录和符号链接的完全权限。这似乎是权限问题。如果我通过“D:\temp\ symbolic_link ”然后我得到符号链接的属性/统计,如果我通过“D:\temp\ symbolic_link \test”然后我得到预期的测试目录的属性/统计。

c c++ windows winapi

4
推荐指数
1
解决办法
2147
查看次数

这段代码容易受到缓冲区溢出的影响

Fortify在下面的代码中报告了一个缓冲区溢出漏洞,理由如下:

在这种情况下,我们主要关注案例"取决于在代码的直接范围之外强制执行的数据的属性".,因为我们无法验证abc.cpp中memcpy()执行的操作的安全性

void create_dir(const char *sys_tmp_dir,  const char *base_name,
                size_t     base_name_len)
{
    char        *tmp_dir;
    size_t      sys_tmp_dir_len;

    sys_tmp_dir_len = strlen(sys_tmp_dir);

   tmp_dir = (char*) malloc(sys_tmp_dir_len + 1 + base_name_len + 1);
   if(NULL == tmp_dir) 
     return;

memcpy(tmp_dir, sys_tmp_dir, sys_tmp_dir_len);
tmp_dir[sys_tmp_dir_len] = FN_LIBCHAR;
memcpy(tmp_dir + sys_tmp_dir_len + 1, base_name, base_name_len);
tmp_dir[sys_tmp_dir_len + base_name_len + 1] = '\0';
..........
..........

}
Run Code Online (Sandbox Code Playgroud)

在我看来这是一个误报,因为我们首先得到数据的大小,分配大量的空间,然后调用memcpy大小来复制.但我正在寻找有充分理由说服其他开发人员摆脱当前的实现,而不是使用c ++字符串.这个问题已经分配给他了.他只是认为这是一个误报,所以不想改变任何东西.

编辑我看到对当前代码的快速,有效的批评.希望我现在能够说服他.否则,我会拿着接力棒.:)

c overflow buffer-overflow

4
推荐指数
1
解决办法
533
查看次数

DeleteFile()或unlink()调用成功但不删除文件

我正面临这个奇怪的问题.要删除文件,请在我的代码中调用unlink() API.此调用将删除该文件并在非Windows平台上成功.在Windows上它成功(返回0)但不删除该文件.

为了实验我添加了一个循环来重复调用相同的API.在第二次迭代中,我得到了一个Permission denied错误,错误代码= 13.虽然在文件中设置了读/写属性,但程序具有访问该文件的完全权限.

然后我调用DeleteFile()而不是unlink()API.令我惊讶的是,我看到相同的结果,调用成功,即返回1但文件未被物理删除.

我通过unlocker实用程序检查,除了试图删除此文件的程序之外,没有其他程序正在访问该文件.

有谁知道还有什么可能是错的?

Edit1: 只是为了确保在删除文件时没有打开文件.我在创建文件时保存了句柄,并在删除文件之前尝试关闭但是我收到错误"'UNOPENED'(错误代码:9 - 错误的文件描述符)".因此,我得出结论,该文件在删除时未打开.

Edit2 根据要求,这是用于创建和删除文件的代码的简化版本.

// Code to create the file
int create_file(const char* path)
{
  HANDLE osfh;                            /* OS handle of opened file */
  DWORD fileaccess;                       /* OS file access (requested) */
  DWORD fileshare;                        /* OS file sharing mode */
  DWORD filecreate;                       /* OS method of opening/creating */
  DWORD fileattrib;                       /* OS file attribute flags */
  SECURITY_ATTRIBUTES SecurityAttributes;


  SecurityAttributes.nLength= sizeof(SecurityAttributes);
  SecurityAttributes.lpSecurityDescriptor= NULL;
  SecurityAttributes.bInheritHandle= !(oflag & _O_NOINHERIT);



 fileaccess= …
Run Code Online (Sandbox Code Playgroud)

c windows winapi win32-process

3
推荐指数
1
解决办法
3361
查看次数

这里的stpncpy()有问题吗?

这是一个现有代码,它找到与父路径相对应的相对路径.它已经在平台上正常工作,除了SUSE 12和GCC 4.7. 我已经提到了一个错误的输出,并在评论中预期. 我想知道为什么会这样? 这段代码有什么问题? 子字符串和父字符串都以NUL字符结尾.我看到的唯一另一件事是源和目标从同一个内存位置传递,换句话说我们正在尝试更新相同内存位置的值.这是真正的问题吗?

//child = /dev/shm/4/tmp/backup/datadir/performance_schema/events_stages_summary_by_account_by_event_name.frm 
//parent =  /dev/shm/4/tmp/backup

char* get_relative_path(char *child, const char *parent)
{
    char* start= child;
    static char dot[] = "." ;

    ....
    ....

    /* Check if child = parent + "/" + ....  */
    if (strstr(child, parent) == child)
    {
        int parent_len= strlen(parent);

        /* parent path may or may not have the "/" suffix. check for both. */
        if (parent[parent_len-1] == FN_LIBCHAR ||
            child[parent_len] == FN_LIBCHAR)
        {
            child+= parent_len;
            while (*child && …
Run Code Online (Sandbox Code Playgroud)

c c++

2
推荐指数
1
解决办法
232
查看次数

假设在没有锁定的线程中更改全局 bool 变量是崩溃安全的是否安全?

我知道这是未定义的行为。因此存在数据竞争或崩溃的可能性。可以使用atomicbool来避免这种可能性。我有兴趣了解有关碰撞安全的信息。

AFAIU,当一个线程读取另一个线程部分写入或撕裂的值时,可能会发生崩溃。另一方面, bool 的大小是由实现定义的,但让它大于数据模型中指针的大小几乎没有意义。

假设 bool 的内存块将被更新或不更新是否安全?因此,其他线程无法读取撕裂值,因此从不同线程读取/写入全局布尔值是安全的吗?

c++ multithreading boolean c++11

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