libabigail
abg-tools-utils.h
Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2 // -*- Mode: C++ -*-
3 //
4 // Copyright (C) 2013-2023 Red Hat, Inc.
5 
6 ///@file
7 
8 #ifndef __ABG_TOOLS_UTILS_H
9 #define __ABG_TOOLS_UTILS_H
10 
11 #include <iostream>
12 #include <istream>
13 #include <memory>
14 #include <ostream>
15 #include <set>
16 #include <string>
17 #include "abg-suppression.h"
18 #include "abg-elf-based-reader.h"
19 
20 namespace abigail
21 {
22 
23 namespace tools_utils
24 {
25 
26 using std::ostream;
27 using std::istream;
28 using std::ifstream;
29 using std::string;
30 using std::set;
31 using std::shared_ptr;
32 
33 const char* get_system_libdir();
38 
39 bool file_exists(const string&);
40 bool is_regular_file(const string&);
41 bool file_has_dwarf_debug_info(const string& elf_file_path,
42  const vector<char**>& debug_info_root_paths);
43 bool file_has_ctf_debug_info(const string& elf_file_path,
44  const vector<char**>& debug_info_root_paths);
45 bool file_has_btf_debug_info(const string& elf_file_path,
46  const vector<char**>& debug_info_root_paths);
47 bool is_dir(const string&);
48 bool dir_exists(const string&);
49 bool dir_is_empty(const string &);
50 bool decl_names_equal(const string&, const string&);
51 bool maybe_get_symlink_target_file_path(const string& file_path,
52  string& target_path);
53 bool base_name(string const& path,
54  string& file_name);
55 bool dir_name(string const &path,
56  string& path_dir_name,
57  bool keep_separator_at_end=false);
58 void real_path(const string&path, string& realpath);
59 bool ensure_dir_path_created(const string&);
60 bool ensure_parent_dir_created(const string&);
61 ostream& emit_prefix(const string& prog_name, ostream& out);
62 bool check_file(const string& path, ostream& out, const string& prog_name = "");
63 bool check_dir(const string& path, ostream& out, const string& prog_name="");
64 bool string_ends_with(const string&, const string&);
65 bool string_begins_with(const string&, const string&);
66 bool string_is_ascii(const string&);
67 bool string_is_ascii_identifier(const string&);
68 bool split_string(const string&, const string&, vector<string>&);
69 bool string_suffix(const string&, const string&, string&);
70 bool sorted_strings_common_prefix(vector<string>&, string&);
73 bool execute_command_and_get_output(const string&, vector<string>&);
74 bool get_dsos_provided_by_rpm(const string& rpm_path,
75  set<string>& provided_dsos);
76 string trim_white_space(const string&);
77 string trim_leading_string(const string& from, const string& to_trim);
78 void convert_char_stars_to_char_star_stars(const vector<char*>&,
79  vector<char**>&);
80 
82 gen_suppr_spec_from_headers(const string& hdrs_root_dir);
83 
85 gen_suppr_spec_from_headers(const string& hdrs_root_dir,
86  const vector<string>& hdr_files);
87 
89 gen_suppr_spec_from_headers(const vector<string>& headers_root_dirs,
90  const vector<string>& header_files);
91 
94  (const vector<string>& abi_whitelist_paths);
95 
96 bool
97 get_vmlinux_path_from_kernel_dist(const string& from,
98  string& vmlinux_path);
99 
100 bool
101 get_binary_paths_from_kernel_dist(const string& dist_root,
102  const string& debug_info_root_path,
103  string& vmlinux_path,
104  vector<string>& module_paths);
105 
106 bool
107 get_binary_paths_from_kernel_dist(const string& dist_root,
108  string& vmlinux_path,
109  vector<string>& module_paths);
110 
111 string
113 
114 string
116 
117 void
119 
120 void
122 
123 bool
124 find_file_under_dir(const string& root_dir,
125  const string& file_path_to_look_for,
126  string& result);
127 
128 class temp_file;
129 
130 /// Convenience typedef for a shared_ptr to @ref temp_file.
131 typedef shared_ptr<temp_file> temp_file_sptr;
132 
133 /// A temporary file.
134 ///
135 /// This is a helper file around the mkstemp API.
136 ///
137 /// Once the temporary file is created, users can interact with it
138 /// using an fstream. They can also get the path to the newly
139 /// created temporary file.
140 ///
141 /// When the instance of @ref temp_file is destroyed, the underlying
142 /// resources are de-allocated, the underlying temporary file is
143 /// closed and removed.
145 {
146  struct priv;
147  std::unique_ptr<priv> priv_;
148 
149  temp_file();
150 
151 public:
152 
153  bool
154  is_good() const;
155 
156  const char*
157  get_path() const;
158 
159  std::fstream&
160  get_stream();
161 
162  static temp_file_sptr
163  create();
164 }; // end class temp_file
165 
166 size_t
168 
169 string
171 
172 /// The different types of files understood the bi* suite of tools.
174 {
175  /// A file type we don't know about.
177  /// The native xml file format representing a translation unit.
179  /// An elf file. Read this kind of file should yield an
180  /// abigail::corpus type.
182  /// An archive (AR) file.
184  // A native abixml file format representing a corpus of one or
185  // several translation units.
186  FILE_TYPE_XML_CORPUS,
187  // A native abixml file format representing a corpus group of one or
188  // several corpora.
189  FILE_TYPE_XML_CORPUS_GROUP,
190  /// An RPM (.rpm) binary file
192  /// An SRPM (.src.rpm) file
194  /// A DEB (.deb) binary file
196  /// A plain directory
198  /// A tar archive. The archive can be compressed with the popular
199  /// compression schemes recognized by GNU tar.
201 };
202 
203 /// Exit status for abidiff and abicompat tools.
204 ///
205 /// It's actually a bit mask. The value of each enumerator is a power
206 /// of two.
208 {
209  /// This is for when the compared ABIs are equal.
210  ///
211  /// Its numerical value is 0.
213 
214  /// This bit is set if there is an application error.
215  ///
216  /// Its numerical value is 1.
218 
219  /// This bit is set if the tool is invoked in an non appropriate
220  /// manner.
221  ///
222  /// Its numerical value is 2.
224 
225  /// This bit is set if the ABIs being compared are different.
226  ///
227  /// Its numerical value is 4.
229 
230  /// This bit is set if the ABIs being compared are different *and*
231  /// are incompatible.
232  ///
233  /// Its numerical value is 8.
235 };
236 
239 
242 
245 
246 bool
248 
249 bool
251 
252 bool
254 
255 /// A type used to time various part of the libabigail system.
256 class timer
257 {
258  struct priv;
259  std::unique_ptr<priv> priv_;
260 
261 public:
262  enum kind
263  {
264  /// Default timer kind.
266  /// This kind of timer starts upon instantiation.
268  };
269 
271  bool start();
272  bool stop();
273  time_t value_in_seconds() const;
274  bool value(time_t& hours,
275  time_t& minutes,
276  time_t& seconds,
277  time_t& milliseconds) const;
278  string value_as_string() const;
279  ~timer();
280 }; //end class timer
281 
282 ostream& operator<<(ostream&, const timer&);
283 
284 ostream&
285 operator<<(ostream& output, file_type r);
286 
287 file_type guess_file_type(istream& in);
288 
289 file_type guess_file_type(const string& file_path);
290 
291 bool
292 get_rpm_name(const string& str, string& name);
293 
294 bool
295 get_rpm_arch(const string& str, string& arch);
296 
297 bool
298 get_deb_name(const string& str, string& name);
299 
300 bool
301 file_is_kernel_package(const string& file_path,
303 
304 bool
305 rpm_contains_file(const string& rpm_path,
306  const string& file_name);
307 
308 bool
309 file_is_kernel_debuginfo_package(const string& file_path,
311 
312 std::shared_ptr<char>
313 make_path_absolute(const char*p);
314 
315 char*
316 make_path_absolute_to_be_freed(const char*p);
317 
318 corpus_group_sptr
320  const string debug_info_root,
321  const string& vmlinux_path,
322  vector<string>& suppr_paths,
323  vector<string>& kabi_wl_paths,
324  suppr::suppressions_type& supprs,
325  bool verbose,
326  environment& env,
327  corpus::origin requested_fe_kind = corpus::DWARF_ORIGIN);
328 
329 elf_based_reader_sptr
330 create_best_elf_based_reader(const string& elf_file_path,
331  const vector<char**>& debug_info_root_paths,
332  environment& env,
333  corpus::origin requested_debug_info_kind,
334  bool show_all_types,
335  bool linux_kernel_mode = false);
336 
337 }// end namespace tools_utils
338 
339 /// A macro that expands to aborting the program when executed.
340 ///
341 /// Before aborting, the macro emits informatin about the source
342 /// location where it was expanded.
343 #define ABG_ASSERT_NOT_REACHED \
344  do { \
345  std::cerr << "in " << __FUNCTION__ \
346  << " at: " << __FILE__ << ":" << __LINE__ \
347  << ": execution should not have reached this point!\n"; \
348  abort(); \
349  } while (false)
350 }//end namespace abigail
351 
352 #endif //__ABG_TOOLS_UTILS_H
This file contains the declarations for an elf-based. DWARF and CTF readers can inherit this one.
origin
This abstracts where the corpus comes from. That is, either it has been read from the native xml form...
Definition: abg-corpus.h:45
This is an abstraction of the set of resources necessary to manage several aspects of the internal re...
Definition: abg-ir.h:140
std::fstream & get_stream()
Get the fstream to the temporary file.
bool is_good() const
Test if the temporary file has been created and is usable.
static temp_file_sptr create()
Create the temporary file and return it if it's usable.
const char * get_path() const
Return the path to the temporary file.
A type used to time various part of the libabigail system.
~timer()
Destructor of the timer type.
string value_as_string() const
Get the elapsed time as a human-readable string.
time_t value_in_seconds() const
Get the elapsed time in seconds.
bool stop()
Stop the timer.
timer(kind k=DEFAULT_TIMER_KIND)
Constructor of the timer type.
bool start()
Start the timer.
@ START_ON_INSTANTIATION_TIMER_KIND
This kind of timer starts upon instantiation.
@ DEFAULT_TIMER_KIND
Default timer kind.
bool value(time_t &hours, time_t &minutes, time_t &seconds, time_t &milliseconds) const
Get the elapsed time in hour:minutes:seconds:milliseconds.
vector< suppression_sptr > suppressions_type
Convenience typedef for a vector of suppression_sptr.
Definition: abg-fwd.h:1533
shared_ptr< type_suppression > type_suppression_sptr
Convenience typedef for a shared pointer to type_suppression.
bool check_file(const string &path, ostream &out, const string &prog_name)
Check if a given path exists and is readable.
bool rpm_contains_file(const string &rpm_path, const string &file_name)
Test if an RPM package contains a given file.
string get_default_system_suppression_file_path()
Get the path to the default system suppression file.
type_suppression_sptr gen_suppr_spec_from_headers(const vector< string > &headers_root_dirs, const vector< string > &header_files)
Generate a type suppression specification that suppresses ABI changes for types defined in source fil...
bool split_string(const string &input_string, const string &delims, vector< string > &result)
Split a given string into substrings, given some delimiters.
bool string_ends_with(const string &str, const string &suffix)
Test if a given string ends with a particular suffix.
bool find_file_under_dir(const string &root_dir, const string &file_path_to_look_for, string &result)
Find a given file under a root directory and return its absolute path.
bool string_is_ascii(const string &str)
Test if a string is made of ascii characters.
ostream & emit_prefix(const string &prog_name, ostream &out)
Emit a prefix made of the name of the program which is emitting a message to an output stream.
bool dir_name(string const &path, string &dir_name, bool keep_separator_at_end)
Return the directory part of a file path.
bool base_name(string const &path, string &file_name)
Return the file name part of a file part.
shared_ptr< temp_file > temp_file_sptr
Convenience typedef for a shared_ptr to temp_file.
bool get_vmlinux_path_from_kernel_dist(const string &from, string &vmlinux_path)
Get the path of the vmlinux binary under the given directory, that must have been generated either fr...
bool file_has_btf_debug_info(const string &elf_file_path, const vector< char ** > &debug_info_root_paths)
Test if an ELF file has BTFG debug info.
void load_default_user_suppressions(suppr::suppressions_type &supprs)
Load the default user suppression specification file and populate a vector of suppression_sptr with i...
const char * get_anonymous_subrange_internal_name_prefix()
Getter of the prefix for the name of anonymous range.
char * make_path_absolute_to_be_freed(const char *p)
Return a copy of the path given in argument, turning it into an absolute path by prefixing it with th...
const char * get_anonymous_enum_internal_name_prefix()
Getter of the prefix for the name of anonymous enums.
std::shared_ptr< char > make_path_absolute(const char *p)
Return a copy of the path given in argument, turning it into an absolute path by prefixing it with th...
const char * get_anonymous_struct_internal_name_prefix()
Getter of the prefix for the name of anonymous structs.
string trim_white_space(const string &str)
Remove spaces at the beginning and at the end of a given string.
bool check_dir(const string &path, ostream &out, const string &prog_name)
Check if a given path exists, is readable and is a directory.
const char * get_anonymous_union_internal_name_prefix()
Getter of the prefix for the name of anonymous unions.
bool string_begins_with(const string &str, const string &prefix)
Test if a given string begins with a particular prefix.
bool file_has_dwarf_debug_info(const string &elf_file_path, const vector< char ** > &debug_info_root_paths)
Test if an ELF file has DWARF debug info.
bool abidiff_status_has_incompatible_abi_change(abidiff_status s)
Test if an instance of.
elf_based_reader_sptr create_best_elf_based_reader(const string &elf_file_path, const vector< char ** > &debug_info_root_paths, environment &env, corpus::origin requested_fe_kind, bool show_all_types, bool linux_kernel_mode)
Create the best elf based reader (or front-end), given an ELF file.
const char * get_system_libdir()
Get the value of $libdir variable of the autotools build system. This is where shared libraries are u...
bool get_binary_paths_from_kernel_dist(const string &dist_root, const string &debug_info_root_path, string &vmlinux_path, vector< string > &module_paths)
Get the paths of the vmlinux and kernel module binaries under given directory.
bool get_dsos_provided_by_rpm(const string &rpm_path, set< string > &provided_dsos)
Get the SONAMEs of the DSOs advertised as being "provided" by a given RPM. That set can be considered...
bool ensure_dir_path_created(const string &dir_path)
Ensures #dir_path is a directory and is created. If #dir_path is not created, this function creates i...
bool get_rpm_name(const string &str, string &name)
Get the package name of an rpm package.
bool execute_command_and_get_output(const string &cmd, vector< string > &lines)
Execute a shell command and returns its output.
abidiff_status & operator|=(abidiff_status &l, abidiff_status r)
The |= operator.
bool is_dir(const string &path)
Tests if a given path is a directory or a symbolic link to a directory.
bool dir_exists(const string &path)
Test that a given directory exists.
bool string_is_ascii_identifier(const string &str)
Test if a string is made of ascii characters which are identifiers acceptable in C or C++ programs.
ostream & operator<<(ostream &o, const timer &t)
Streaming operator for the timer type.
bool file_is_kernel_package(const string &file_path, file_type file_type)
Tests if a given file name designates a kernel package.
abidiff_status operator|(abidiff_status l, abidiff_status r)
The bitwise 'OR' operator for abidiff_status bit masks.
string get_library_version_string()
Return the version string of the library.
bool dir_is_empty(const string &path)
Test if a given directory exists and is empty.
bool abidiff_status_has_abi_change(abidiff_status s)
Test if an instance of.
bool abidiff_status_has_error(abidiff_status s)
Test if an instance of.
bool get_deb_name(const string &str, string &name)
Get the package name of a .deb package.
bool maybe_get_symlink_target_file_path(const string &file_path, string &target_path)
If a given file is a symbolic link, get the canonicalized absolute path to the target file.
abidiff_status
Exit status for abidiff and abicompat tools.
@ ABIDIFF_ABI_INCOMPATIBLE_CHANGE
This bit is set if the ABIs being compared are different *and* are incompatible.
@ ABIDIFF_ABI_CHANGE
This bit is set if the ABIs being compared are different.
@ ABIDIFF_USAGE_ERROR
This bit is set if the tool is invoked in an non appropriate manner.
@ ABIDIFF_ERROR
This bit is set if there is an application error.
@ ABIDIFF_OK
This is for when the compared ABIs are equal.
bool is_regular_file(const string &path)
Test if path is a path to a regular file or a symbolic link to a regular file.
bool file_exists(const string &path)
Tests whether a path exists;.
file_type
The different types of files understood the bi* suite of tools.
@ FILE_TYPE_RPM
An RPM (.rpm) binary file.
@ FILE_TYPE_NATIVE_BI
The native xml file format representing a translation unit.
@ FILE_TYPE_ELF
An elf file. Read this kind of file should yield an abigail::corpus type.
@ FILE_TYPE_DEB
A DEB (.deb) binary file.
@ FILE_TYPE_UNKNOWN
A file type we don't know about.
@ FILE_TYPE_TAR
A tar archive. The archive can be compressed with the popular compression schemes recognized by GNU t...
@ FILE_TYPE_DIR
A plain directory.
@ FILE_TYPE_AR
An archive (AR) file.
@ FILE_TYPE_SRPM
An SRPM (.src.rpm) file.
bool file_has_ctf_debug_info(const string &elf_file_path, const vector< char ** > &debug_info_root_paths)
Test if an ELF file has CTF debug info.
bool string_suffix(const string &input_string, const string &prefix, string &suffix)
Get the suffix of a string, given a prefix to consider.
bool ensure_parent_dir_created(const string &path)
Ensures that the parent directory of #path is created.
suppressions_type gen_suppr_spec_from_kernel_abi_whitelists(const std::vector< std::string > &abi_whitelist_paths)
Generate a suppression specification from kernel abi whitelist files.
corpus_group_sptr build_corpus_group_from_kernel_dist_under(const string &root, const string debug_info_root, const string &vmlinux_path, vector< string > &suppr_paths, vector< string > &kabi_wl_paths, suppressions_type &supprs, bool verbose, environment &env, corpus::origin requested_fe_kind)
Walk a given directory and build an instance of corpus_group from the vmlinux kernel binary and the l...
void convert_char_stars_to_char_star_stars(const vector< char * > &char_stars, vector< char ** > &char_star_stars)
Convert a vector<char*> into a vector<char**>.
bool sorted_strings_common_prefix(vector< string > &input_strings, string &prefix)
Find the prefix common to a *SORTED* vector of strings.
void real_path(const string &path, string &result)
Return the real path of a given path.
abidiff_status operator&(abidiff_status l, abidiff_status r)
The bitwise 'AND' operator for abidiff_status bit masks.
bool file_is_kernel_debuginfo_package(const string &file_name, file_type file_type)
Tests if a given file name designates a kernel debuginfo package.
void load_default_system_suppressions(suppr::suppressions_type &supprs)
Load the default system suppression specification file and populate a vector of suppression_sptr with...
string get_abixml_version_string()
Return the version string for the ABIXML format.
string get_random_number_as_string()
Get a pseudo random number as string.
bool decl_names_equal(const string &l, const string &r)
Compare two fully qualified decl names by taking into account that they might have compontents that a...
bool get_rpm_arch(const string &str, string &arch)
Get the architecture string from the NVR of an rpm.
string get_default_user_suppression_file_path()
Get the path to the default user suppression file.
string trim_leading_string(const string &from, const string &to_trim)
Remove a string of pattern in front of a given string.
file_type guess_file_type(istream &in)
Guess the type of the content of an input stream.
size_t get_random_number()
Get a pseudo random number.
Toplevel namespace for libabigail.