Indexing operator of iterator_range<counting_iterator<...>> produces undefined behavior
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 45/100
Direzione di ricerca
Inizia compilando il riproduttore di test_counting_iterator_range_indexing.cpp e ispeziona boost/range/iterator_range_core.hpp intorno a iterator_range_base::operator[]. Conferma l’avviso e il comportamento di riferimento pendente di counting_iterator, quindi aggiungi un test di regressione che dimostri che range[0] produce 0 senza comportamento indefinito.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Example:
#include <boost/iterator/counting_iterator.hpp>
#include <boost/range/iterator_range.hpp>
#include <iostream>
#include <type_traits>
int main(int, char **)
{
using iterator = boost::counting_iterator<int>;
using iterator_range = boost::iterator_range<iterator>;
iterator first(0), last(3);
iterator_range range(first, last);
std::cout << "iterator::reference is a reference type: " << std::is_reference<iterator::reference>::value << std::endl;
std::cout << "iterator_range::reference is a reference type: " << std::is_reference<iterator_range::reference>::value << std::endl;
std::cout << "first[0] returns a reference type: " << std::is_reference<decltype(first[0])>::value << std::endl;
std::cout << "range[0] returns a reference type: " << std::is_reference<decltype(range[0])>::value << std::endl;
std::cout << "first[0] == " << first[0] << std::endl;
std::cout << "range[0] == " << range[0] << std::endl; // <-- segfault
}
Output:
iterator::reference is a reference type: 1
iterator_range::reference is a reference type: 1
first[0] returns a reference type: 0
range[0] returns a reference type: 1
first[0] == 0
Segmentation fault (core dumped)
Expected behavior: range[0] returns 0.
If Boost headers are copied to ./boost and the program is compiled with g++ -I. option, the compiler produces the following warning:
In file included from ./boost/range/iterator_range.hpp:13,
from test_counting_iterator_range_indexing.cpp:2:
./boost/range/iterator_range_core.hpp: In instantiation of ‘boost::iterator_range_detail::iterator_range_base<IteratorT, boost::iterators::random_access_traversal_tag>::reference boost::iterator_range_detail::iterator_range_base<IteratorT, boost::iterators::random_access_traversal_tag>::operator[](boost::iterator_range_detail::iterator_range_base<IteratorT, boost::iterators::random_access_traversal_tag>::difference_type) const [with IteratorT = boost::iterators::counting_iterator<int>; boost::iterator_range_detail::iterator_range_base<IteratorT, boost::iterators::random_access_traversal_tag>::reference = const int&; boost::iterator_range_detail::iterator_range_base<IteratorT, boost::iterators::random_access_traversal_tag>::difference_type = long int]’:
test_counting_iterator_range_indexing.cpp:23:43: required from here
./boost/range/iterator_range_core.hpp:391:32: warning: returning reference to temporary [-Wreturn-local-addr]
return this->m_Begin[at];
^
The reason for the segmentation fault is that iterator_range::operator[] returns a reference to a stack-allocated object returned by counting_iterator::operator[].
- Lingua principale
- C++
- Stelle
- 45
- Fork
- 104
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
Non abbiamo ancora controllato i file di configurazione di questo progetto. Parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di boostorg/range
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 65/100
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 70/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 35/100
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 38/100
Tutte le issue di boostorg/range
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
KhronosGroup/Vulkan-Tutorial#524 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
microsoft/onnxruntime-genai#2633 ·
I maintainer di solito rispondono entro 1 giorno
-
mapper bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
firebase/firebase-ios-sdk#16718 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
tesseract-ocr/tesseract#4627 ·