Numpy: Ubuntu 16.04์—์„œ fromfile๋กœ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์ฝ์„ ๋•Œ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ๋ฐ segfault

์— ๋งŒ๋“  2018๋…„ 10์›” 31์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy


fromfile ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ๋ฐ ํŒŒ์ผ์˜ ๋์„ ์ง€๋‚˜์„œ ์ฝ๋Š” ๊ฒฝ์šฐ ๊ฐ€๋” segfault๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ฝ๊ธฐ๊ฐ€ ํŒŒ์ผ ๋์„ ์ง€๋‚˜๊ฐˆ ์ง€ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” Ubuntu 16.04์—์„œ segfault๋กœ ์ด์–ด์ง€์ง€ ๋งŒ OSX์—์„œ๋Š” segfault๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์žฌํ˜„ ์ฝ”๋“œ ์˜ˆ :

import numpy as np

def test_read_from_file():
    # create an empty file named `empty.bin`
    filename = 'empty.bin'
    open(filename, 'a').close()

    # read large chunk of data, past the end of the file
    dtype = [('data', '<f4', 500,)]
    count = 100000000

    with open(filename, 'rb') as fh:
        data = np.fromfile(fh, dtype, count)

    print(data.shape)

์—๋Ÿฌ ๋ฉ”์‹œ์ง€:


ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ ์ฝ”๋“œ 139๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค (์‹ ํ˜ธ 11 : SIGSEGV์— ์˜ํ•ด ์ค‘๋‹จ๋จ).

Numpy / Python ๋ฒ„์ „ ์ •๋ณด :

ํ”Œ๋žซํผ ๋ฆฌ๋ˆ…์Šค-Python 3.6.6, pytest-3.8.2, py-1.6.0, pluggy-0.7.1

00 - Bug numpy.core

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ์šฐ๋ถ„ํˆฌ์—์„œ ์ž˜๋ชป ์ฒ˜๋ฆฌ๋˜๊ณ  segfault๋ฅผ ์ผ์œผํ‚ค๋Š” MemoryError ๋ฅผ ์–ป๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ˆ˜์ • ๋œ PR์€ ์—ฌ๊ธฐ : https://github.com/numpy/numpy/pull/12354

๋ชจ๋“  4 ๋Œ“๊ธ€

์ฐธ๊ณ ๋กœ 1.15.3์—์„œ ์žฌํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํฌ๊ธฐ๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์ „์ฒด ํŒŒ์ผ์„ ์ฝ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ผ๋ถ€ ์‹œ์Šคํ…œ์—์„œ ์กฐ์šฉํžˆ ์ž‘๋™ํ•œ๋‹ค๋ฉด, ๋งŒ์ผ์„ ๋Œ€๋น„ํ•˜์—ฌ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ๋„ฃ์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์„ ๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค).

ํŽธ์ง‘ : ๋‚˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์‹ฑ ๋•Œ๋ฌธ์— ์ „์ฒด ํŒŒ์ผ์ด ์˜ต์…˜ ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์ธ๋ฑ์‹ฑ์€ ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ์•ฝ๊ฐ„ ํŠน๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ์ œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ์ฝ๊ธฐ์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ์ „ํžˆ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํŒŒ์ผ์˜ ๋์— ๋„๋‹ฌํ•˜๊ฑฐ๋‚˜ fromfile ์˜ count ์— ๋„๋‹ฌ ํ•  ๋•Œ๊นŒ์ง€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฝ์€ ์‹ค์ œ ๋ ˆ์ฝ”๋“œ ์ˆ˜๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค (์•”์‹œ ์ ์œผ๋กœ ์ด๊ฒƒ์€ ๊ฒฐ๊ณผ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค). ์ •์ƒ์ ์ธ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ถ€๋ถ„ ์ฝ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ฆ‰, ์ฝ์„ ํฌ๊ธฐ๊ฐ€ ํŒŒ์ผ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์— ๋งž์ง€ ์•Š์œผ๋ฉด ์˜ฌ๋ฆฌ์‹ญ์‹œ์˜ค.

์–ด๋–ค ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ numpy ์ฒ ํ•™์— ๋” ์ž˜ ๋งž๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์ด ๋” ์œ ์šฉํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๊ฐ€ ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ง€๊ธˆ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ fromfile์ด ์•Œ๋ ค์ง„ ํฌ๊ธฐ๊ฐ€์—†๋Š” ๊ฐ์ฒด์™€ ๊ฐ™์€ ํŒŒ์ผ์„ ์ง€์›ํ•˜๋Š”์ง€ ๋˜๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ sep kwarg์˜ ๊ฒฝ์šฐ ํ˜„์žฌ ๋ฐœ์ƒํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

@amuresan fromfile ์˜ ์ฝ”๋“œ๋Š” C๋กœ๋˜์–ด ์žˆ์ง€๋งŒ, ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ์žˆ๋‹ค๋ฉด ํ•ญ์ƒ pull request์— ๋งŒ์กฑํ•˜๊ณ  ์žˆ์œผ๋ฉฐ C (Python) API์— ์กฐ๊ธˆ๋งŒ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์€ ํ•ฉ๋ฆฌ์ ์ธ ์–ด๋ ค์›€์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ์šฐ๋ถ„ํˆฌ์—์„œ ์ž˜๋ชป ์ฒ˜๋ฆฌ๋˜๊ณ  segfault๋ฅผ ์ผ์œผํ‚ค๋Š” MemoryError ๋ฅผ ์–ป๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ˆ˜์ • ๋œ PR์€ ์—ฌ๊ธฐ : https://github.com/numpy/numpy/pull/12354

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰