GithubHelp home page GithubHelp logo

Comments (21)

qicosmos avatar qicosmos commented on August 16, 2024

谢谢报告,稍晚看一下。

from cinatra.

poor-circle avatar poor-circle commented on August 16, 2024

hi,我在使用cinatra的時候會遇到一些問題,在http read request的時候body會有髒數據,檢查了一下發現發生問題的地方出在details::resize中,gcc的resize_and_overwrite貌似會返回capacity,在stackoverflow中有討論,并且gcc bugzilla也有提到。 我使用的環境爲ubuntu 22.04 / gcc 13.2/ cinatra 0.8.3 感謝。

我们现在没有用到这个函数提供的sz啊

from cinatra.

qicosmos avatar qicosmos commented on August 16, 2024

有测试代码?需要复现查问题。

from cinatra.

hoskylucky avatar hoskylucky commented on August 16, 2024

cinatra這裏用到了resize,裏面是用std::base_string::resize_and_overwrite進行string的内存擴展(std=c++23),作者的blog也有提到,測試代碼

from cinatra.

poor-circle avatar poor-circle commented on August 16, 2024

问题是我们不会用到返回值

from cinatra.

poor-circle avatar poor-circle commented on August 16, 2024

所以问题出在别的地方。
你能否提供一段测试代码?

from cinatra.

hoskylucky avatar hoskylucky commented on August 16, 2024

這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。

from cinatra.

poor-circle avatar poor-circle commented on August 16, 2024

這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。

實際上設置成了30-> 指的是string的容量?

from cinatra.

hoskylucky avatar hoskylucky commented on August 16, 2024

是的,string.size()是大於body_len的,但是後面沒有/0,所以外面可能讀出髒數據

from cinatra.

poor-circle avatar poor-circle commented on August 16, 2024

是的,string.size()是大於body_len的,但是後面沒有/0,所以外面可能讀出髒數據

你指的是string::size()大于body_len还是string::capacity()大于body_len

from cinatra.

poor-circle avatar poor-circle commented on August 16, 2024

這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。

我理解,代码期望的行为可能是,

1.body_len==25, size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。

如果出问题,可能是:
2. body_len==25, size()==25, capacity()==30,但是data[25]是脏数据而不是\0
3. body_len==25, size()==30, capacity()==30.
在你的测试代码中是哪种情况呢?

from cinatra.

hoskylucky avatar hoskylucky commented on August 16, 2024

這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。

我理解,代码期望的行为可能是,size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。

是的這個行爲是正常的,但是在使用memcpy的時候僅拷貝了body_len爲25的字節,後面沒有\0,就變成了5個字節的髒數據。
現在是bodylen是25,size()是30,capacity()是30,使用memcpy拷貝了25字節,應該是拷貝25+1個字節,把\0算上。
不知道我是否描述清楚了。

from cinatra.

poor-circle avatar poor-circle commented on August 16, 2024

這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。

我理解,代码期望的行为可能是,size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。

是的這個行爲是正常的,但是在使用memcpy的時候僅拷貝了body_len爲25的字節,後面沒有\0,就變成了5個字節的髒數據。 現在是bodylen是25,size()是30,capacity()是30,使用memcpy拷貝了25字節,應該是拷貝25+1個字節,把\0算上。 不知道我是否描述清楚了。

@qicosmos

from cinatra.

poor-circle avatar poor-circle commented on August 16, 2024

這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。

我理解,代码期望的行为可能是,size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。

是的這個行爲是正常的,但是在使用memcpy的時候僅拷貝了body_len爲25的字節,後面沒有\0,就變成了5個字節的髒數據。 現在是bodylen是25,size()是30,capacity()是30,使用memcpy拷貝了25字節,應該是拷貝25+1個字節,把\0算上。 不知道我是否描述清楚了。

這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。

我理解,代码期望的行为可能是,size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。

是的這個行爲是正常的,但是在使用memcpy的時候僅拷貝了body_len爲25的字節,後面沒有\0,就變成了5個字節的髒數據。 現在是bodylen是25,size()是30,capacity()是30,使用memcpy拷貝了25字節,應該是拷貝25+1個字節,把\0算上。 不知道我是否描述清楚了。

所以是这三种情况的哪一种呢?

from cinatra.

poor-circle avatar poor-circle commented on August 16, 2024

1.body_len==25, size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。
2. body_len==25, size()==25, capacity()==30,但是data[25]是脏数据而不是\0
3. body_len==25, size()==30, capacity()==30.

from cinatra.

hoskylucky avatar hoskylucky commented on August 16, 2024

1.body_len==25, size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。 2. body_len==25, size()==25, capacity()==30,但是data[25]是脏数据而不是\0 3. body_len==25, size()==30, capacity()==30.

  1. body_len==25, size()==30, capacity()==30, 但是data[25]是脏数据而不是\0

from cinatra.

qicosmos avatar qicosmos commented on August 16, 2024

能给个测试cinara的代码吗,先不纠结resize这里,我希望有个实际的例子能复现问题。@hoskylucky

from cinatra.

poor-circle avatar poor-circle commented on August 16, 2024

我懂了,等下会提一个pr fix

from cinatra.

poor-circle avatar poor-circle commented on August 16, 2024

https://godbolt.org/z/EefoE751z

我理解问题以及修复方案是这样的

from cinatra.

qicosmos avatar qicosmos commented on August 16, 2024

用这个pr #512
验证一下
@hoskylucky

from cinatra.

hoskylucky avatar hoskylucky commented on August 16, 2024

這樣就沒問題了,感謝。

from cinatra.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.