小编Son*_*Ex2的帖子

比较一个已经空闲的指针调用UB吗?

这似乎是一个相当常见的模式,例如在hexchat中(可能无法编译,另请参阅插件文档.还请注意,这些文档hexchat_plugin_get_info尚未永久使用,因此我为了简单起见省略了它):

static hexchat_plugin *ph;
static int timer_cb(void *userdata) {
    if (hexchat_set_context(ph, userdata)) { /* <-- is this line UB? */
        /* omitted */
    }
    return 0;
}
static int do_ub(char *word[], char *word_eol[], void *userdata) {
    void *context = hexchat_get_context(ph);
    hexchat_hook_timer(ph, 1000, timer_cb, context);
    hexchat_command(ph, "close"); /* free the context - in practice this would be done by another plugin or by the user, not like this, but for the purposes of this example this …
Run Code Online (Sandbox Code Playgroud)

c undefined-behavior hexchat

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

出于演示目的,我如何打印悬空指针?

我想,为什么他们有一个悬摆指针向别人解释和自由是如何工作(以及指针的值,因此是通过按值),但我认为我需要一种方法来打印指针与工作不" t"不确定"(如同printf("%p", ptr)).

memcpy会不会这样做?

char buf1[sizeof(char *)];
char buf2[sizeof(char *)];
char *malloced = malloc(10);
memcpy(buf1, &malloced, sizeof(char *));
free(malloced);
memcpy(buf2, &malloced, sizeof(char *));
for (int i=0; i<sizeof(char *); i++) {
    printf("%hhd %hhd / ", buf1[i], buf2[i]);
}
Run Code Online (Sandbox Code Playgroud)

c language-lawyer dangling-pointer

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

如何深入比较2个Lua表,这些表可能有也可能没有表作为键?

(也发布在Lua邮件列表上)

所以我一直在编写深度复制算法,我想测试它们是否按照我希望的方式工作.虽然我可以访问原始 - >复制映射,但我想要一个通用的深度比较算法,它必须能够比较表键(表作为键?).

我的深拷贝算法在这里是可用的:https://gist.github.com/SoniEx2/fc5d3614614e4e3fe131(它不是很有条理,但有3个,一个使用递归调用,另一个使用todo表,另一个模拟一个调用堆栈(以非常丑陋但5.1兼容的方式))

递归版:

local function deep(inp,copies)
  if type(inp) ~= "table" then
    return inp
  end
  local out = {}
  copies = (type(copies) == "table") and copies or {}
  copies[inp] = out -- use normal assignment so we use copies' metatable (if any)
  for key,value in next,inp do -- skip metatables by using next directly
    -- we want a copy of the key and the value
    -- if one is not available on the copies …
Run Code Online (Sandbox Code Playgroud)

algorithm lua compare equality

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

为什么我不能在元标记上放置 HSTS 标头?

所以我正在使用 github 页面,目前没有办法强制使用 HTTPS,所以我有一个“聪明”的想法,将 HSTS 标头放在元标记上。因此,我将其添加到页面中:

<meta http-equiv="Strict-Transport-Security" content="max-age=31536000" />
Run Code Online (Sandbox Code Playgroud)

Aaand它没有用。为什么它不起作用?!乙:

我的浏览器是 Firefox Nightly。

html firefox http

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

这是一种在C中做标记指针的可移植方式吗?

我编写了这个C代码,我假设它提供了可移植的标记指针:

typedef struct {
    char tag[2];
    int data;
} tagged_int;

#define TAG(x,y) (&(x)->tag[(y)])
#define UNTAG(x) (&(x)[-*(x)])

int main(void) {
    tagged_int myint = {{0,1}, 33};
    tagged_int *myptr = &myint;

    char *myint_tag_1 = TAG(myptr,1);
    char *myint_tag_0 = TAG(myptr,0);

    char tag_1 = *myint_tag_1;
    char tag_0 = *myint_tag_0;

    tagged_int *myint_1 = UNTAG(myint_tag_1);
    tagged_int *myint_0 = UNTAG(myint_tag_0);
}
Run Code Online (Sandbox Code Playgroud)

但是,我很好奇它是否真的可携带.

虽然数组操作部分是可移植的,但是转换是char *struct *移植的,假设char *指的是第一个字段/元素struct *?(这很遗憾地输出编译器警告,但我猜你会得到带有"正常"标记指针的那些......)

c portability pointers language-lawyer

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

如何将切片转换为数组引用?

我有一个,&[u8]并希望把它变成一个&[u8; 3]没有复制.它应该引用原始数组.我怎样才能做到这一点?

arrays slice rust

4
推荐指数
3
解决办法
1145
查看次数

否定INT_MIN是否为不确定行为?

假设我有一个i来自外部来源的变量:

int i = get_i();
Run Code Online (Sandbox Code Playgroud)

假设iINT_MIN和的补码表示形式,是-i不确定的吗?

c c99 c89 undefined-behavior

3
推荐指数
2
解决办法
714
查看次数

比较 SQLite 查询中两个可能为 NULL 的值

我有一个 SQLite 查询,如:

SELECT max(e), url, branch FROM (SELECT max(T1.entry) e, T1.url, T1.branch FROM repo_history T1
                                                        WHERE (SELECT active FROM repos T2 WHERE url = T1.url AND branch = T1.branch AND project = ?1)
                                                        GROUP BY T1.url, T1.branch
                                                        UNION
                                                        SELECT null, T3.url, T3.branch FROM repos T3 WHERE active AND project = ?1 )
                               GROUP BY url ORDER BY e
Run Code Online (Sandbox Code Playgroud)

请注意,该?1参数出现了两次。无论如何,在某些情况下,它可以为空(None在 python 中,据我所知,NULL在 SQLite 中变成了)。这是一个问题,因为我不了解 null 处理,但基本上我没有得到任何回报。

那么,我如何处理where "project" = ?1什么时候?1是 …

python sqlite sql-null

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

“ HEAD”在哪里定义为无效的分支名称?

我正在查看git docs,但没有地方说“ HEAD”是无效的分支名称。但是,尝试建立一个名为“ HEAD”的分支会给我:

fatal: 'HEAD' is not a valid branch name.
Run Code Online (Sandbox Code Playgroud)

如果在任何地方都有记录,则看不到。就文档而言,我应该能够做到吗?但是我为什么不能呢?

git

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

正则表达式可以做基本算术吗?

这是一个相对简单的问题.PCRE(没有扩展功能,例如能够调用主机的功能)可以进行基本算术吗?也就是说,我可以使用PCRE对一元非负整数进行加,减,除和乘以?如果是这样,怎么样?(注意:我可以控制输入,正则表达式和替换字符串)

regex math pcre

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

如何在JSON中使用对象作为键?

我有这种整洁的数据格式,最好用对象作为键表示.所以我尝试使用以下JSON:

{
  "blocks": {
    "stone": {
      {
        "variant": ["bricks", "smooth"]
      }: {
        "sound": "guitar",
        "particle": "guitar",
      }
    },
    "dirt": {
      {
        "variant": "dirt"
      }: {
        "sound": "square",
        "particle": "note",
        "volume": 0.5
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但它给了我一个JsonSyntaxException.我正在使用GSON btw.我怎样才能做到这一点?

数据结构:

import java.util.*;
public class Instrument {
  private final String name;
  private final String particle;
  private final float volume;
  public Instrument(String name, Optional<String> particle, Optional<Float> volume) {
    this.name = name;
    this.particle = particle.orElse("note");
    this.volume = volume.orElse(1.0f);
  }
  /* getters and stuff */
} …
Run Code Online (Sandbox Code Playgroud)

java json user-input gson javascript-objects

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

将元素插入到有序向量中的最有效方法是什么?

我有一个排序v: Vec<EventHandler<T>>,我想在保持排序的同时插入一个元素.最有效的方法是什么?Rust似乎没有内置的方法来做到这一点.

EventHandler<T> 如下:

struct EventHandler<T: Event + ?Sized> {
    priority: i32,
    f: fn(&mut T),
}
Run Code Online (Sandbox Code Playgroud)

由于排序如何工作,插入和排序将是低效的,具有O(n log n)时间复杂性和2*n分配成本.

rust

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

"无长"快速排序算法

我一直在研究排序算法.到目前为止,我发现的所有排序算法要么依赖于已知长度(几乎所有排序算法.我不能使用它们,因为"正确"长度是O(n)),或者比快速排序慢(例如插入分类).

在Lua中,有两个长度概念:

  • 适当的序列长度
    • 是O(n)
    • 由ipairs等使用
  • 序列长度
    • 是O(log n)
    • 有洞(零值)
    • 由table.insert等使用

我已经研究过heapsort,但是heapsort需要构建一个堆,然后排序.它不能同时作为单个操作,这意味着它仍然存在O(n)长度问题.

使用插入排序,您只需运行插入排序算法,直到您点击第一个nil.这只排序表的"正确序列"部分(即,从1到n的键没有任何nil值),但插入排序比quicksort慢.

是否有任何就地排序算法,如插入排序,不依赖于长度,但性能可与快速排序相媲美?

示例插入排序代码(在维基百科的帮助下):

function isort(t)
  -- In-place insertion sort that never uses the length operator.
  -- Stops at the first nil, as expected. Breaks if you use "for i = 1, #t do"
  for i in ipairs(t) do
      local j = i
      while j > 1 and t[j-1] > t[j] do
          t[j], t[j-1] = t[j-1], t[j]
          j = j - 1
      end
  end
end

local …
Run Code Online (Sandbox Code Playgroud)

sorting algorithm lua in-place time-complexity

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